
达梦数据库-深入理解LENGTH_IN_CHAR和CHARSET
达梦数据库深入理解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 实验规划
配置 | 字段长度 | 英文存储个数 | 中文存储个数 | 实际字节数 |
---|---|---|---|---|
GB18030 | LENGTH_IN_CHAR=0 | VARCHAR(5) | 5 | 2.5(实际2) |
GB18030 | LENGTH_IN_CHAR=1 | VARCHAR(5) | 10 | 5 |
UTF-8 | LENGTH_IN_CHAR=0 | VARCHAR(5) | 5 | 1.6(实际1) |
UTF-8 | LENGTH_IN_CHAR=1 | VARCHAR(5) | 20 | 6.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
更多推荐
所有评论(0)