1、length_in_char
LENGTH_IN_CHAR:VARCHAR 类型对象的长度是否以字符为单位。取值:1、Y 表示是,0、N 表示否。默认值为 0。可选参数。1 或 Y:是,所有 VARCHAR 类型对象的长度以字符为单位。这种情况下,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。同时,存储的字节长度 8188 上限仍然不变,也就是说,即使定义列长度为 8188 字符,其实际能插入的字符串占用总字节长度仍然不能超过 8188。
2、 CHARSET
CHARSET/UNICODE_FLAG:字符集选项。取值:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0。
LENGTH_IN_CHAR 与 CHARSET/UNICODE_FLAG 参数配合时,有多种搭配结果。
以不同的字符编码的 varchar(10) 为例:
以下以一实例,进行详细介绍:
- 当参数 UNICODE_FLAG=1、LENGTH_IN_CHAR=0 时。一个汉字占用三个字节,一个英文占用一个字节。例如:列定义为 varchar(3),那么只能存入 1 个汉字或者 3 个英文字母。如下图:
- 当参数 UNICODE_FLAG=1、LENGTH_IN_CHAR=1 时,一个汉字占三个字节,一个英文字母占一个字节,一个字符四个字节(即一个 varchar 单位占四个字节),可以存四个英文字母。例如:列定义为 varchar(1),那么最多只能存入一个汉字或者 4 个英文字母。如下图:
- 当参数 UNICODE_FLAG=0、LENGTH_IN_CHAR=1 时,一个汉字占两个字节一个字符,一个英文字母占一个字节,一个字符可以存一个汉字或者两个英文字母。例如:列定义为 varchar(3),那么最多只能存入三个汉字或者 6 个英文字母。如下图:
- 当参数 UNICODE_FLAG=0、LENGTH_IN_CHAR=0 时,一个汉字占两个字节,一个英文字符占一个字节。一个汉字占用两个字节。例如:列定义为 varchar(3),那么最多存入一个汉字或者 3 个英文字母。如下图:
3、BLANK_PAD_MODE
BLANK_PAD_MODE 主要用于 Oracle 数据的兼容,达梦默认设置 BLANK_PAD_MODE=0,即在做数据对比时,默认会截断字符结尾的空格,而 Oracle 默认是会识别到字符结尾的空格。 设置如下场景验证:
1. 在BLANK_PAD_MODE=0时
SQL> create table student(id int, name varchar(20));
SQL> insert into student values (1,'blank ');
SQL> commit;
SQL> insert into student values (1,'blank');
SQL> commit;
SQL> create unique index idx_test_blank on student(name);
create unique index idx_test_blank on student(name);
[-6612]:违反唯一性约束.
已用时间: 4.925(毫秒). 执行号:0.
2. 在BLANK_PAD_MODE=1时,同样的表和数据
登录使用时间 : 4.018(ms)
disql V8
SQL> create unique index idx_test_blank on student(name);
操作已执行
已用时间: 5.721(毫秒). 执行号:50700.
执行创建唯一索引会成功。