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

2023年 12月 7日 63.8k 0

达梦数据库版本:

    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 INTERVAL
                2 INTERVAL


                已用时间: 0.456(毫秒). 执行号:5245214.

                疑问:

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

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

                  参考链接:

                    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数据库是否有类似情况

                                Oracle:11.2.0.4.0

                                Oracle可以正常查询

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

                                INTERVAL不属于保留字

                                  SQL> col interval for a30
                                  SQL> select INTERVAL from dba_jobs where rownum 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###

                                      相关文章

                                      Oracle如何使用授予和撤销权限的语法和示例
                                      Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
                                      下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
                                      社区版oceanbase安装
                                      Oracle 导出CSV工具-sqluldr2
                                      ETL数据集成丨快速将MySQL数据迁移至Doris数据库

                                      发布评论