达梦数据库LENGTH_IN_CHAR(对象的长度是否以字符为单位)总结

LENGTH_IN_CHAR:
VARCHAR 类型对象的长度是否以字符为单位。取值:1、Y表示是,0、N表示否。默认值为0。可选参数
1 或Y:是,所有VARCHAR类型对象的长度以字符为单位。这种情况下,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。同时,存储的字节长度 8188 上限仍然不变,也就是说,即使定义列长度为 8188 字符,其实际能插入的字符串占用总字节长度仍然不能超过8188;
0 或N:否,所有VARCHAR 类型对象的长度以字节为单位。
---------------------------------------------------------------------------------------------
创建实例的时候,该参数默认为0,varchar类型的字段长度是以字节为单位,那么该参数为0和1的时候,以及编码选择GB18030和UNICODE的时候,varchar类型字段存入的实际情况又是如何呢?下面通过不同的场景测试结果来给出一个确定的答案。

共用的建表语句如下:

create table test(c1 varchar(10));
table test(c1 varchar(10));
一、UNICODE_FLAG=0,LENGTH_IN_CHAR=0






--插入10个英文,正常
插入10个英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入11个英文,错误
插入11个英文,错误
insert into test(c1) values('ABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJA');

--插入5个中文,正常
插入5个中文,正常
insert into test(c1) values('测试一下测');
into test(c1) values('测试一下测');
--插入6个中文,错误
插入6个中文,错误
insert into test(c1) values('测试一下测试');
into test(c1) values('测试一下测试');



二、UNICODE_FLAG=0,LENGTH_IN_CHAR=1






--插入10个英文,正常
插入10个英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入11个英文,正常
插入11个英文,正常
insert into test(c1) values('ABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJA');
--插入20个英文,正常
插入20个英文,正常
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
--插入21个英文,错误
插入21个英文,错误
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJABCDEFGHIJA');

--插入10个中文,正常
插入10个中文,正常
insert into test(c1) values('测试一下测试一下测试');
into test(c1) values('测试一下测试一下测试');
--插入11个中文,错误
插入11个中文,错误
insert into test(c1) values('测试一下测试一下测试一');
into test(c1) values('测试一下测试一下测试一');
--插入10个中文1个英文,错误
插入10个中文1个英文,错误
insert into test(c1) values('测试一下测试一下测试A');
into test(c1) values('测试一下测试一下测试A');



三、UNICODE_FLAG=1,LENGTH_IN_CHAR=0






--插入10个英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入11个英文,错误
insert into test(c1) values('ABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJA');

--插入5个中文,正常
insert into test(c1) values('测试一');
into test(c1) values('测试一');
--插入5个中文1个英文,正常
insert into test(c1) values('测试一A');
into test(c1) values('测试一A');
--插入6个中文,错误
insert into test(c1) values('测试一下');
into test(c1) values('测试一下');
--插入5个中文2个英文,错误
insert into test(c1) values('测试一AB');
into test(c1) values('测试一AB');



四、UNICODE_FLAG=1,LENGTH_IN_CHAR=1






--插入10个英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入20个英文,正常
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
--插入40个英文,正常
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ');
--插入41个英文,错误
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA');

--插入10个中文,正常
insert into test(c1) values('测试一下测试一下测试');
into test(c1) values('测试一下测试一下测试');
--插入13个中文,正常
insert into test(c1) values('测试一下测试一下测试一下测');
into test(c1) values('测试一下测试一下测试一下测');
--插入14个中文,错误
insert into test(c1) values('测试一下测试一下测试一下测试');
into test(c1) values('测试一下测试一下测试一下测试');
--插入13个中文1个英文,正常
insert into test(c1) values('测试一下测试一下测试一下测A');
into test(c1) values('测试一下测试一下测试一下测A');
--插入13个中文2个英文,错误
insert into test(c1) values('测试一下测试一下测试一下测AB');
into test(c1) values('测试一下测试一下测试一下测AB');



综合测试结果得出结论如下:
配置 字段长度 英文存储个数 中文存储个数 实际字节数 备注
UNICODE_FLAG=0
LENGTH_IN_CHAR=0 VARCHAR(10) 10 5 10 中文占2字节
UNICODE_FLAG=0
LENGTH_IN_CHAR=1 VARCHAR(10) 20 10 20 中文站2字节,以字符为单位,
自动扩充为双倍字节数
UNICODE_FLAG=1
LENGTH_IN_CHAR=0 VARCHAR(10) 10 3.3 10 中文占3字节
UNICODE_FLAG=1
LENGTH_IN_CHAR=1 VARCHAR(10) 40 13.3 40 中文站3字节,以字符为单位,
自动扩充为4倍
————————————————
版权声明:本文为CSDN博主「fachu121」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fachu121/article/details/105290551/

posted @ 2022-01-19 09:59  不再犯错  阅读(1270)  评论(0编辑  收藏  举报