dm7中的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));

一、UNICODE_FLAG=0,LENGTH_IN_CHAR=0
–插入10个英文,正常
insert into test(c1) values(‘ABCDEFGHIJ’);
–插入11个英文,错误
insert into test(c1) values(‘ABCDEFGHIJA’);

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

二、UNICODE_FLAG=0,LENGTH_IN_CHAR=1
–插入10个英文,正常
insert into test(c1) values(‘ABCDEFGHIJ’);
–插入11个英文,正常
insert into test(c1) values(‘ABCDEFGHIJA’);
–插入20个英文,正常
insert into test(c1) values(‘ABCDEFGHIJABCDEFGHIJ’);
–插入21个英文,错误
insert into test(c1) values(‘ABCDEFGHIJABCDEFGHIJA’);

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

三、UNICODE_FLAG=1,LENGTH_IN_CHAR=0

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

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

四、UNICODE_FLAG=1,LENGTH_IN_CHAR=1

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

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

综合测试结果得出结论如下:
dm7中的length_in_char初始化参数