在初始化DM数据库时,有个参数 LENGTH_IN_CHAR 感觉较难理解,所以参照官方文档,网上博客研究下
先看官方文档对LENGTH_IN_CHAR参数的解释
VARCHAR类型对象的长度是否以字符为单位。取值:1、Y表示是,0、N表示否。默认值为0。可选参数。
1或Y:是,所有VARCHAR类型对象的长度以字符为单位。这种情况下,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。同时,存储的字节长度8188上限仍然不变,也就是说,即使定义列长度为8188字符,其实际能插入的字符串占用总字节长度仍然不能超过8188;
0或N:否,所有VARCHAR类型对象的长度以字节为单位。
先按默认字符集GB18030进行测试
select lengthb('中') from dual
union all
select lengthb('A') from dual
union all
select lengthb('z') from dual;
如上执行结果,在字符集GB18030中,一个汉字占用2个字节,一个英文字母占用1个字节
当LENGTH_IN_CHAR=0时;
使用SQL查看实例的字符集和LENGTH_IN_CHAR参数值
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME='LENGTH_IN_CHAR' OR PARA_NAME like '%CHARSET%';
创建测试表
create table test(c1 varchar(10));
导入测试数据
--插入10个英文字母,执行成功
insert into test(c1) values('ABCDEFGHIJ');
--插入11个英文字母,执行失败,列长度超出定义
insert into test(c1) values('ABCDEFGHIJK');
--插入5个汉字,执行成功
insert into test(c1) values('哈哈哈哈哈');
--插入6个汉字,执行失败,列长度超出定义
insert into test(c1) values('哈哈哈哈哈哦');
–查看已插入的数据占多少字节
select *, lengthb(c1)
from test;
LENGTH_IN_CHAR=1时;
使用SQL查看实例的字符集和LENGTH_IN_CHAR参数值
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME='LENGTH_IN_CHAR' OR PARA_NAME like '%CHARSET%';
创建测试表
create table test(c1 varchar(10));
导入测试数据
--插入10个英文字母,执行成功
insert into test(c1) values('ABCDEFGHIJ');
--插入11个英文字母,执行成功
insert into test(c1) values('ABCDEFGHIJK');
--插入20个英文字母,执行成功
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
--插入21个英文字母,执行失败,列长度超出定义
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJK');
--插入10个汉字,执行成功
insert into test(c1) values('哈哈哈哈哈哈哈哈哈哈');
--插入11个汉字,执行失败,列长度超出定义
insert into test(c1) values('哈哈哈哈哈哈哈哈哈哈哦');
--插入10个汉字1个英文字母,执行失败,列长度超出定义
insert into test(c1) values('哈哈哈哈哈哈哈哈哈哈A');
–查看已插入的数据占多少字节
select *, lengthb(c1)
from test;
再按字符集UTF-8进行测试
select lengthb('中') from dual
union all
select lengthb('A') from dual
union all
select lengthb('z') from dual;
如上执行结果,在字符集UTF-8中,一个汉字占用3个字节,一个英文字母占用1个字节
LENGTH_IN_CHAR=0时;
使用SQL查看实例的字符集和LENGTH_IN_CHAR参数值
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME='LENGTH_IN_CHAR' OR PARA_NAME like '%CHARSET%';
创建测试表
create table test(c1 varchar(10));
导入测试数据
--插入10个英文字母,执行成功
insert into test(c1) values('ABCDEFGHIJ');
--插入11个英文字母,执行失败,列长度超出定义
insert into test(c1) values('ABCDEFGHIJK');
--插入3个汉字,执行成功
insert into test(c1) values('哈哈哈');
--插入3个汉字一个英文,执行成功
insert into test(c1) values('哈哈哈A');
--插入4个汉字,执行失败,列长度超出定义
insert into test(c1) values('哈哈哈哈');
--插入3个汉字2个英文字母,执行失败,列长度超出定义
insert into test(c1) values('哈哈哈AB');
select *, lengthb(c1)
from test;
LENGTH_IN_CHAR=1时;
使用SQL查看实例的字符集和LENGTH_IN_CHAR参数值
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME='LENGTH_IN_CHAR' OR PARA_NAME like '%CHARSET%';
创建测试表
create table test(c1 varchar(10));
导入测试数据
--插入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');
–查看已插入的数据占多少字节
select *, lengthb(c1)
from test;
总结:
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字节数据、中文占2字节,以字符为单位,自动扩充为4倍字节数
参考博客链接:https://blog.csdn.net/fachu121/article/details/105290551/
更多资讯请上达梦技术社区了解:https://eco.dameng.com