一、简介
DM数据库在进行汉字处理的时候,会用到varchar的数据类型,默认是以字节为单位。如果数据库的字符集为GB18030,那一个中文汉字占用两个字节;如果数据库的字符集为UTF-8,那一个中文汉字占用三个字节。如果数据库是以字符为单位,会有什么不同结果
二、参数介绍
charset:表示数据库中所有数据的字符集,初始化的时候进行设置,一旦初始化完成,字符集将无法修改,默认字符集为GB18030(例如:GB18030、UTF-8)
length_in_char:表示varchar类型对象的长度是否以字符为单位。当设置为1时以字符长度为单位,定义的长度并非真正按照字符长度调整,而是将存储长度按照理论字符长度进行放大,会出现实际可插入字符数超过定义长度的情况,存储的字节长度为8188上限仍不变;当设置为0时以字节为单位进行存储。
三、案例测试
例一:charset=0 length_in_char=0
create table pp(id int,name varchar(3));
insert into pp values(‘平‘); --执行成功
insert into pp values(‘平a‘); --执行成功
insert into pp values(‘平安‘); --name列超出定义
说明:字符集为GB18030的情况下,一个汉字占用两个字节,所以可以插入一个汉字及字母,插入两个汉字即报错
例二:charset=1 length_in_char=0
create table pp(id int,name varchar(3));
insert into pp values(‘平‘); --执行成功
insert into pp values(‘平a‘); --name列超出定义
insert into pp values(‘平安‘); --name列超出定义
说明:字符集为UTF-8的情况下,一个汉字一般需要占用三个字节,所以varchar(3)只能插入一个汉字。
例三:charset=0 length_in_char=1
insert into pp values(‘平‘); --执行成功
insert into pp values(‘平安‘); --执行成功
insert into pp values(‘平安中‘); --执行成功
insert into pp values(‘平安中国‘); --name列超出定义
说明:length_in_char=1的情况下,varchar类型的实际存储会按一定的比例放大。当字符集为GB18030时,varchar(3)的实际存储是3个汉字,也就是3*2=6个字节的数据。
例四:charset=1 length_in_char=1
create table pp(id int,name varchar(3));
insert into pp values(1,’平’); --执行成功
insert into pp values(1,’平安’); --执行成功
insert into pp values(1,’平安中’); --执行成功
insert into pp values(1,’平安中心’); --执行成功
insert into pp values(1,’平安中心哈’); --name列超出定义
insert into pp values(1,’平安中心a’); --name列超出定义
说明:DM数据库中实际存储数据是以字节为单位,在charset=1并且length_in_char=1的情况下varchar类型对象的实际存储的最大长度为定义的长度*4个字节。所以varchar(3)可以存储的实际数据为3*4=12个字节为4个汉字。
结论:
1)length_in_char=0 varchar类型是以字节为单位进行存储,当字符集为GB18030时一个汉字占用两个字节;当字符集为UTF-8时一个汉字占用三个字节。
2)length_in_char=1 varchar类型是以字符为单位,当字符集为GB18030时占用的字节数等于定义长度*2;当字符集为UTF-8时占用的字节数等于定义长度*4。
达梦技术社区: https://eco.dameng.com