达梦数据库-深入理解LENGTH_IN_CHAR和CHARSET


一、实验要求

深入理解CASE_SENSITIVE参数的作用,涉及大小写敏感的配置和差异

二、功能描述

  • LENGTH_IN_CHAR
    功能: VARCHAR 类型对象的长度是否以字符为单位。
    取值: 取值:1、Y 表示是,0、N 表示否。默认值为 0。1 或 Y:是,所有 VARCHAR 类型对象的长度以字符为单位。这种情况下,会将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。单存储的字节长度 8188 上限仍然不变。
    配置: dminit
    说明: 此参数在数据库创建成功后无法修改,可通过查询 V$PARAMETER 中的 LENGTH_IN_CHAR 参数名查看此参数的设置值。

  • CHARSET/UNICODE_FLAG
    功能: 此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。
    取值: 取值:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0。
    配置: dminit
    说明: 数据库一旦初始化完成,字符集就将无法修改。可使用 select unicode 来查询当前数据库的字符集种类。

三、实验步骤

1 实验规划

配置字段长度英文存储个数中文存储个数实际字节数
GB18030LENGTH_IN_CHAR=0VARCHAR(5)52.5(实际2)
GB18030LENGTH_IN_CHAR=1VARCHAR(5)105
UTF-8LENGTH_IN_CHAR=0VARCHAR(5)51.6(实际1)
UTF-8LENGTH_IN_CHAR=1VARCHAR(5)206.6(实际6)

说明:
(1)GB18030中文占2各字符,UTF-8中文占3个字符;英文均只占一个字符。
(2)开启LENGTH_IN_CHAR后。如果字符集为GB18030,则varchar会自动扩充字节至2倍;如果字符集为UTF-8,则会自动扩充至最大长度的4倍。

2 数据库初始化

根据实验规划的不同参数,分别初始化DB1、DB2、DB3和DB4四个数据库:

DB1:./dminit path=/dm8/data DB_NAME=db1 instance_name=db1 port_num=6001 LENGTH_IN_CHAR=0 CHARSET=0;
DB2:./dminit path=/dm8/data DB_NAME=db2 instance_name=db2 port_num=6002 LENGTH_IN_CHAR=1 UNICODE_FLAG=0;
DB1:./dminit path=/dm8/data DB_NAME=db3 instance_name=db3 port_num=6003 LENGTH_IN_CHAR=0 UNICODE_FLAG=1;
DB1:./dminit path=/dm8/data DB_NAME=db4 instance_name=db4 port_num=6004 LENGTH_IN_CHAR=1 UNICODE_FLAG=1;
SQL> select unicode;

在这里插入图片描述

SQL> select * from v$parameter where NAME='LENGTH_IN_CHAR';

在这里插入图片描述

3 英文字符测试

SQL> create table t1(name varchar(5));
SQL> insert into t1 values('aaaaa');commit;
SQL> insert into t1 values('aaaaab');commit;
SQL> insert into t1 values('aaaaabbbbb');commit;
SQL> insert into t1 values('aaaaabbbbbc');commit;
SQL> insert into t1 values('aaaaabbbbbcccccddddd');commit;
SQL> insert into t1 values('aaaaabbbbbcccccddddde');commit;

DB1执行结果:最多插入5个英文字符
在这里插入图片描述
DB2执行结果:最多插入10个英文字符
在这里插入图片描述
DB3执行结果:最多插入5个英文字符
在这里插入图片描述
DB4执行结果:最多插入20个英文字符
在这里插入图片描述

4 中文字符测试

SQL> create table t2(name varchar(5));
SQL> insert into t2 values('我');commit;
SQL> insert into t2 values('我爱');commit;
SQL> insert into t2 values('我爱吃');commit;
SQL> insert into t2 values('我爱吃武汉');commit;
SQL> insert into t2 values('我爱吃武汉热');commit;
SQL> insert into t2 values('我爱吃武汉热干');commit;

DB1结果:最多插入2个中文字符
在这里插入图片描述
DB2结果:最多插入5个中文字符
在这里插入图片描述
DB3结果:最多插入1个中文字符
在这里插入图片描述
DB4结果:最多插入6个中文字符
在这里插入图片描述

四、结论:

(1)GB18030中文占2各字符,UTF-8中文占3个字符;英文均只占一个字符。
(2)开启LENGTH_IN_CHAR后。如果字符集为GB18030,则varchar会自动扩充字节至2倍;如果字符集为UTF-8,则会自动扩充至最大长度的4倍。

社区地址:https://eco.dameng.com

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值