Oracle、MySQL、达梦数据库保留字问题对比


外向笑小鸭子
外向笑小鸭子 2024-01-12 12:13:37 66268 赞同 0 反对 0
分类: 资源 标签: 运维
Oracle、MySQL、达梦数据库保留字问题对比

达梦数据库版本:

  •  
DM:8.1.3.26

背景:

检查数据库JOBS时,一直提示语法错误:

执行语句:

  •  
SELECT JOB,SCHEMA_USER,LAST_DATE,LAST_SEC,NEXT_DATE,FAILURES,INSTANCE,INTERVAL FROM DBA_JOBS;

最终定位到是 INTERVAL 保留字的问题;

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
SQL> SELECT INTERVAL FROM DBA_JOBS;SELECT INTERVAL FROM DBA_JOBS;
SELECT INTERVAL FROM DBA_JOBS; * 第 1 行, 第 16 列[FROM]附近出现错误[-2007]:语法分析出错.已用时间: 0.274(毫秒). 执行号:0.

按 * 执行,没有报错,自动转义了;

  •  
SELECT * FROM DBA_JOBS;

经测试保留字添加双引号后可以正常执行:

  •  
SELECT "INTERVAL" FROM DBA_JOBS;

不能用反引号

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
SQL> SELECT `INTERVAL` FROM DBA_JOBS;SELECT `INTERVAL` FROM DBA_JOBS;
SELECT `INTERVAL` FROM DBA_JOBS; * 第 1 行, 第 7 列[`]附近出现错误[-2007]:语法分析出错.已用时间: 0.235(毫秒). 执行号:0.

也不能使用单引号,会当成固定字符串。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
SQL> SELECT 'INTERVAL' FROM DBA_JOBS;行号     'INTERVAL'---------- ----------1          INTERVAL2          INTERVAL
已用时间: 0.456(毫秒). 执行号:5245214.

疑问:

  •  
  •  
  •  
一.达梦保留字转义方法有哪些?二.达梦数据库自带的系统表保留字查询时也需要特殊处理吗?.OracleMySQL数据库是否有类似情况?

一.达梦保留字转义方法有哪些?

参考链接:

  •  
  •  
https://eco.dameng.com/community/article/6ca6b591fecb40d2941e524af5fc25c9作者:LeeWen

1.添加双引号

经测试关键字添加双引号后可以正常执行:

  •  
SELECT "INTERVAL" FROM DBA_JOBS;

2.数据库配置文件dm.ini中EXCLUDE_RESERVED_WORDS参数

  •  
EXCLUDE_RESERVED_WORDS:

语法解析时,需要去除的保留字列表,保留字之间以逗号分隔。默认为空,静态参数。

V$RESERVED_WORDS视图中RES_FIXED=N的关键字通过EXCLUDE_RESERVED_WORDS参数设置之后将会失效,V$RESERVED_WORDS视图不会再记录。

或者disql进入数据库实例,执行以下命令:

  •  
sp_set_para_string_value(2,'EXCLUDE_RESERVED_WORDS','xxx');

重启数据库服务生效

3.dm_svc.conf配置文件中KEYWORDS配置项

使用时需要注意,在dm_svc.conf文件中配置KEYWORDS时,KEYWORDS应配置在“服务配置区”中,不应直接配置到“全局配置区”。

示例:

  •  
KEYWORDS=(xxx,yyy.zzz)

4.客户端连接字符串url屏蔽指定关键字

示例:

  •  
jdbc:dm://192.1.1.100:5236/CJC?keywords=(xxx,yyy,zzz)

二.达梦数据库自带的系统表保留字查询时也需要特殊处理吗?

是的,需要转义

  •  
SELECT "INTERVAL" FROM DBA_JOBS;

三.Oracle、MySQL数据库是否有类似情况

甲骨文:11.2.0.4.0

Oracle可以正常查询

但并不是Oracle数据库自带的系统表保留字查询时不需要特殊处理,而是因为INTERVAL不是Oracle的保留字。

INTERVAL不属于保留字

  •  
  •  
  •  
  •  
  •  
  •  
SQL> col interval for a30SQL> select INTERVAL from dba_jobs where rownum<=2;INTERVAL------------------------------sysdate + 8/24sysdate + 10/1440

查看含有INTERVAL列的表

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
set pagesize 1000set line 300col owner for a30select owner,table_name,column_name from dba_tab_columns where column_name='INTERVAL';OWNER                          TABLE_NAME                     COLUMN_NAME------------------------------ ------------------------------ ------------------------------SYS                            ALL_PART_INDEXES               INTERVALSYS                            DEFSCHEDULE                    INTERVALSYS                            DBA_JOBS                       INTERVAL......37 rows selected.

查看Oracle有哪些保留字

  •  
  •  
  •  
SET PAGESIZE 2000SELECT ROWNUM,KEYWORD FROM V$RESERVED_WORDS WHERE RESERVED='Y';......

查询保留字对应的表、列信息

  •  
  •  
  •  
  •  
SET LINE 300SET PAGESIZE 3000COL OWNER FOR A10SELECT OWNER,TABLE_NAME,CLOUMN_NAME FROM DBA_TAB_COLUMNS WHERE COLUMN_NAME IN (SELECT KEYWORD FROM V$RESERVED_WORDS WHERE RESERVED='Y');

查询任意一张表

  •  
  •  
SELECT MODE FROM SYS.V$_DIAG_VHM_RUN where rownum<=1;ORA-00936:missing expressioin

需要转义,也是双引号

  •  
SELECT "MODE" FROM SYS.V$_DIAG_VHM_RUN where rownum<=1;

不支持反引号、单引号转义,和达梦类似;

MySQL版本:8.0.32

查看 INTERVAL 属于MySQL保留字

  •  
SELECT RESERVED,WORD FROM INFORMATION_SCHEMA.KEYWORDS WHERE WORD='INTERVAL';

查询保留字信息

  •  
  •  
  •  
mysql> SELECT ROW_NUMBER() OVER(ORDER BY WORD) as ROW_NUM,WORD FROM INFORMATION_SCHEMA.KEYWORDS WHERE RESERVED=1 ORDER BY 2;......262 rows in set (0.00 sec)

保留字测试

  •  
  •  
mysql> alter table t1 add  INTERVAL int;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTERVAL int' at line 1
  •  
  •  
  •  
mysql> alter table t1 add  `INTERVAL` int;Query OK, 0 rows affected (0.09 sec)Records: 0  Duplicates: 0  Warnings: 0

需要使用反引号进行转义

  •  
mysql> select `INTERVAL` from t1;

单引号和双引号不能进行转义会被识别为固定字符

  •  
  •  
mysql> select 'INTERVAL' from t1;mysql> select "INTERVAL" from t1;

总结:

1.达梦、Oracle、MySQL保留字名称、数量有很大差异;

例如:

INTERVAL 在 达梦和MySQL数据库中属于保留字,在Oracle中不属于保留字,如果涉及Oracle迁移达梦数据库,需要考虑保留字的影响。

2.达梦、Oracle、MySQL保留字转义方式不同;

达梦和Oracle使用双引号进行转义;

MySQL使用反引号进行转义;

3.达梦、Oracle、MySQL数据库系统表中的保留字也需要转义,和普通表无区别。

###chenjuchao 20231206###

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
外向笑小鸭子L1
粉丝 0 资源 91 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  503
MiSans 阿拉伯语字体文件  443
解决新版本麒麟系统中微信打开白屏显示  385
麒麟系统进行系统监控,查看进程的运行时间来优化性能  319
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  210
统信uos单一程序黑屏,任务栏正常显示解决办法  206
统信桌面专业版添加字体  203
统信uos快捷键文档  174
统信系统双无线网卡设置关闭开启单一网卡  142
分享一个磁盘恢复工具,适用于多平台(包括统信)  118
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信桌面专业版添加字体 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!