DM8 大小写字符敏感及LENGTH_IN_CHAR参数理解

如何理解DM数据库大小写敏感

场景一、数据库为大小写不敏感

  1. 查看当前数据库大小写敏感信息

1表示大小写敏感,0表示大小写不敏感

  1. 创建表wzp,name字段不加“”号

获取建表ddl语句

列name被自动转化成大写,获取ddl语句时表名用大写也能查到

创建表wzp1,name字段加“”号

获取建表ddl语句

创建表wzp1时,name列加了引号,没有被转化成大写,保持原样

创建表wzp3,表名加引号

获取建表ddl语句

加引号后,表名也没被转化成大写,获取ddl语句时表名用大写提示报错,没有该表

结论:大小写敏感的数据库中,创建表时:

      如果不对表名或列名添加“”,那么表名和列名自动转化成大写形式

      如果对表名或列名添加“”,那么会固定书写时的大小写,不会进行转化。

场景二、数据库为大小写不敏感

  1. 查看当前数据库大小写敏感信息

0表示当前数据库大小写不敏感,1表示大小写敏感

  1. 创建wzp表,表名小写,name列小写

获取ddl建表语句

表名和列名没有被转化成大写

创建表wzp1,表名小写,name列大写

获取ddl语句

表名没有被转化成大写,name列依然保持大写

创建表wzp2,name列小写加引号“”

获取ddl语句

表名和列名没有被转化成大写

创建表wzp3,表名和列name大写加“”

获取ddl语句

表名和列name都是大写

结论:大小写不敏感的数据库中,创建表时:

      无论对不对表名或者列名添加“”,表名和列名都不会发生变化,大写形式就是大写形式,小写形式就是小写形式,不会进行转化。

      不允许存在同名的数据库对象,即使大小写不同,默认只能存在一个。

达梦数据库汉字存储

UNICODE_FLAG和LENGTH_IN_CHAR两个跟字符集相关的参数

UNICODE_FLAG

此参数表示了数据库中所有数据的字符集,包括数据字典的字符集,需要注意的是,数据库一旦初始化完成,字符集就无法修改,可以用select Unicode查询当前数据库的字符集,0代表GB18030,1代表utf-8

LENGTH_IN_CHAR

此参数决定了数据库中的varchar类型对象的长度是否以字符为单位,取值1则是设置以字符为单位,将存储长度值按照理论字符长度进行放大。取值为0,则所有varchar类型对象长度以字节为单位

场景一、

Unicode_flag和length_in_char都设置为0,字符集GB18030,varchar长度以字节为单位

GB18030字符集下,一个汉字需要占用两个字节,所以varchar(3)可以插入一个汉字加上一个半角字符,但是无法插入两个汉字。

场景二

UNICODE_FLAG=1,LENGTH_IN_CHAR=0

字符集为utf-8,varchar长度以字节为单位

Utf-8字符集的情况下,一个汉字需要占用三个字节,所以varchar(3)只能插入一个汉字。

场景三

UNICODE_FLAG=0,LENGTH_IN_CHAR=1

字符集为GB18030,varchar长度以字节为单位

在length_in_char=1的情况下,varchar的实际可存储字节数会按一定比例放大,所以在使用GB18030的时候,varchar(3)实际可以存储3个汉字,也就是3*2个字节的数据

场景四

UNICODE_FLAG=1,LENGTH_IN_CHAR=1

字符集为utf-8,archar长度以字符为长度

这里我们会发现一个奇怪的情况,明明设置是 varchar(3),为什么可以插入 4 个汉字呢。这是因为在 DM7 中数据库实际存储数据是以字节为单位。在 lengtg_in_char=1 且字符集为 utf-8 的时候,VARCHAR 类型对象的实际存放的最大长度是 VARCHAR 类型定义的长度*4 字节。

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

也就是说,这里一个 varchar(3) 的结构可以存放的数据为 3*4=12 个字节。然而事实上 UTF-8 中的一个汉字一般只用占用 3 个字节,所以这里我们可以插入 12/3=4 个汉字

总结:当 LENGTH_IN_CHAR=0 的情况下,varchar() 的长度是以字节数为单位。这时我们只需要考虑汉字和全角字符所占用字节数,其中 gb18030 的一个汉字是两个字节,utf-8 的一个汉字一般是三个字节。如果插入数据的总字节数大于 varchar 定义的长度,则会插入失败。

当 LENGTH_IN_CHAR=1 的情况下,varchar() 所能存储的字节数将会按照一定比例扩展。字符集为 gb18030 时 varchar 的字节数等于定义长度 *2,字符集为 utf-8 时 varchar 的字节数为定义长度 *4

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值