DM数据库初始化实例时LENGTH_IN_CHAR参数的理解

在初始化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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值