达梦数据库DM8 - 关于字母大小写、单引号、双引号
达梦数据库DM8 - 关于字母大小写、单引号、双引号_达梦 字段 引号-CSDN博客
近期对达梦数据库DM8做测试时候,有个问题困扰了我大半天,百度几个来回也没找到原因。
最开始是使用dexp导出表的时候一直报错,最终发现跟建表的时候使用小写字母有关系。从而延伸出单引号、双引号的使用。
下面系统的对大小写、单引号、双引号做一个测试。
首先,在初始化数据库的时候,默认勾选了“字符串比较大小写敏感”。
这样,数据库初始化完成后,建表的时候,如果表名或列名使用小写字母,那么今后书写SQL语句的时候就要麻烦很多了,必须严格区分单引号、双引号的使用。字符串常量应使用单引号括起,关键字、对象名、字段名、别名等则使用双引号括起。
同时,在大小敏感的数据库下,使用dexp导出数据库、模式正常,但导出小写字母创建的表时,却一直提示“表不存在或者为系统内部对象,请核对后再进行输入”。( 这算bug吗 -_?)
大小写敏感的数据库初始化完成后,分别建了3张表, 表a的表名和列名均小写, 表B的表名大写,列名小写, 表C的表名和列名均大写。
建表语句如下:
-
create table "a"
-
(
-
"c1" INT not null ,
-
"c2" CHAR(10)
-
);
-
create table "B"
-
(
-
"c1" INT not null ,
-
"c2" CHAR(10)
-
);
-
create table "C"
-
(
-
"C1" INT not null ,
-
"C2" CHAR(10)
-
);
场景1: 针对表名和列名都是小写字母的表,下图3种执行结果:
1、表名不用引号括起,提示“无效的表或视图名”;
2、表名使用单引号括起,被当成字符串,报语法错误;
3、表名使用双引号,正常显示查询结果。
场景2:针对表名和列名都是小写字母的表,下图3种执行结果:
1、列名不用引号括起,报错“无效的列名”。
2、列名使用单引号括起,列名被当成字符串,显示到查询结果。
3、列名使用双引号括起,成功执行语句并显示正确结果。
场景3:针对表名和列名都是小写字母的表,下图3种执行结果:
1、条件语句的字符串不使用引号括起,报错“无效列名”。
2、条件语句的字符串使用单引号括起,正常显示正确结果。
3、条件语句使用双引号括起,报错“无效列名”。
场景4:针对表名大写,列名小写的表,执行结论如下:
- 表名大写时,即使表名不使用双引号括起,也能正常执行语句。
- 列名是小写字母,所以依旧还是需要使用双引号括起。
- 字符串则只能使用单引号括起,不能用双引号。
场景5:针对表名和列名均大写的表,执行结论如下:
- 表名和列名不使用引号,或使用双引号括起,均正常执行语句显示正确结果。当然,字符串依旧只能使用单引号。
场景6: 数据库初始化时候,取消勾选“字符串比较大小写敏感”。同样创建小写字母的表a,列名也使用小写字母。
表名和列名不使用引号或使用双引号均正常执行并显示正确结果。字符串依旧是必须单引号括起。
以上测试可能是达梦数据库产品对大小写的设定原本就是这样。但是下面测试dexp导出表就有问题了。
先登录大小写敏感的数据库,使用dexp导出数据库,正常无报错。
再使用dexp导出模式u_test,也正常无报错。
但当要导出小写字母创建的表的时候,不管表名列名是否使用引号,均会提示“表 XXX.XX 不存在或者为系统内部对象,请核对后再进行输入”。如下截图所示。
重新连接大小写不敏感的数据库,再使用dexp导出小写字母创建的表 ,则不管表名是否使用引号括起,均能正常导出。
总结:
在字母大小写敏感的数据库,创建表时,不管是表名还是列名,都应使用大写字母。否则,在执行SQL语句的时候,字符串常量应使用单引号括起,关键字、对象名、字段名、别名等则使用双引号括起。但以小写字母为表名的表,在使用dexp导出表的时候,会无法正常导出(这个也许是个bug吧)。所以,在大小写敏感的数据库,建议建表的时候,就应当完全使用大写字母建表。
达梦数据库:无法自动获取数据库类型,请通过 dialect 参数指定!_升级pagehelper的版本5.2.0 达梦数据库-CSDN博客
项目使用的Mybatis和PageHelper的版本是4.1.0,数据库国产化升级,报错:
问题解决:Cause: com.github.pagehelper.PageException: 无法自动获取数据库类型,请通过 dialect 参数指定!
解决方式:
升级pageHelper的版本5.2.0.
原因:
新版加入了PageAutoDialect
registerDialectAlias(“dm”, OracleDialect.class);
达梦数据源适配Hibernate-jpa_java项目利用hibernate连接达梦数据库-CSDN博客
用户与模式的关系
每个用户有一个默认的同名的模式,访问自己模式下的表、视图等,不需要加模式名,访问其他模式下的对象需要加上模式名。
查询当前用户模式下的表,无需加对象名
我们以 TEST 用户为例,当查询自己模式下得表时,可以直接进行查询,无需加对象名,如下图所示:
Copyselect * from test
查询其他用户模式下的表,需要加对象名
我们以 TEST 用户为例,查询 SYSJOB 用户模式下的一张表,如不加对象名,则查询会报出无效的表名或者视图名,如下图所示:
Copyselect * from sysjobs
这时需要加上对应的对象名,如下图所示:
Copyselect * from sysjob.sysjobs