达梦数据库DM8 - 关于字母大小写、单引号、双引号

达梦数据库DM8 - 关于字母大小写、单引号、双引号_达梦 字段 引号-CSDN博客

近期对达梦数据库DM8做测试时候,有个问题困扰了我大半天,百度几个来回也没找到原因。

最开始是使用dexp导出表的时候一直报错,最终发现跟建表的时候使用小写字母有关系。从而延伸出单引号、双引号的使用。

 

下面系统的对大小写、单引号、双引号做一个测试。

 

首先,在初始化数据库的时候,默认勾选了“字符串比较大小写敏感”。

这样,数据库初始化完成后,建表的时候,如果表名或列名使用小写字母,那么今后书写SQL语句的时候就要麻烦很多了,必须严格区分单引号、双引号的使用。字符串常量应使用单引号括起,关键字、对象名、字段名、别名等则使用双引号括起。

同时,在大小敏感的数据库下,使用dexp导出数据库、模式正常,但导出小写字母创建的表时,却一直提示“表不存在或者为系统内部对象,请核对后再进行输入”。( 这算bug吗 -_?)

大小写敏感的数据库初始化完成后,分别建了3张表, 表a的表名和列名均小写, 表B的表名大写,列名小写, 表C的表名和列名均大写

建表语句如下:

 
  1. create table "a"
  2. (
  3. "c1" INT not null ,
  4. "c2" CHAR(10)
  5. );
  6. create table "B"
  7. (
  8. "c1" INT not null ,
  9. "c2" CHAR(10)
  10. );
  11. create table "C"
  12. (
  13. "C1" INT not null ,
  14. "C2" CHAR(10)
  15. );
 

场景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

右键表空间模块,点击新建表空间

用户与模式的关系 | 达梦技术文档 (dameng.com)

posted @ 2024-02-26 17:52  CharyGao  阅读(2784)  评论(0编辑  收藏  举报