这2个参数在官方文档分别给的解释如下:
LENGTH_IN_CHAR
VARCHAR 类型对象的长度是否以字符为单位。
1:是,设置为以字符为单位时,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。同时,存储的字节长度 8188 上限仍然不变,也就是说,即使定义列长度为8188 字符,其实际能插入的字符串占用总字节长度仍然不能超过 8188;
0:否,所有 VARCHAR 类型对象的长度以字节为单位。
CHARSET
字符集选项。
0代表 GB18030;
1代表UTF-8;
2代表韩文字符集 EUC-KR。
Utf8汉字一般占用3个字节
GB18030汉字一般占用2个字节
测试环境规划
因为字符集是初始化参数,在创建实例时候就固定下来了,所以创建4个实例来分别测试:
序号 | 实例名称 | 端口 | 数据存放路径 | LENGTH_IN_CHAR | UNICODE_FLAG | 备注 |
---|---|---|---|---|---|---|
1 | PRODC | 5239 | /dmC/data | 0 | 0 | 字符+ GB18030默认值 |
2 | PRODD | 5240 | /dmD/data | 0 | 1 | 字符+ UTF-8 |
3 | PRODE | 5241 | /dmE/data | 1 | 0 | 字节+ GB18030 |
4 | PRODF | 5242 | /dmF/data | 1 | 1 | 字节+ UTF-8 |
1. 创建数据存放路径并授权
[root@gs08 ~]# mkdir -p /dmC/data [root@gs08 ~]# chown -R dmdba:dinstall /dmC/data [root@gs08 ~]# mkdir -p /dmD/data [root@gs08 ~]# chown -R dmdba:dinstall /dmD/data [root@gs08 ~]# mkdir -p /dmE/data [root@gs08 ~]# chown -R dmdba:dinstall /dmE/data [root@gs08 ~]# mkdir -p /dmF/data [root@gs08 ~]# chown -R dmdba:dinstall /dmF/data
复制
2. PRODC实例创建和启动
[dmdba@gs08 bin]$ ./dminit PATH=/dmC/data DB_NAME=PRODC instance_name=PRODC SYSDBA_PWD=Dameng123 PORT_NUM=5239 CASE_SENSITIVE=Y LENGTH_IN_CHAR=0 UNICODE_FLAG=0 initdb V8 db version: 0x7000c file dm.key not found, use default license! License will expire on 2023-05-25 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL log file path: /dmC/data/PRODC/PRODC01.log log file path: /dmC/data/PRODC/PRODC02.log write to dir [/dmC/data/PRODC]. create dm database success. 2022-08-30 10:53:20
复制
3. PRODD实例创建和启动
[dmdba@gs08 bin]$ ./dminit PATH=/dmD/data DB_NAME=PRODD instance_name=PRODD SYSDBA_PWD=Dameng123 PORT_NUM=5240 CASE_SENSITIVE=Y LENGTH_IN_CHAR=0 UNICODE_FLAG=1 initdb V8 db version: 0x7000c file dm.key not found, use default license! License will expire on 2023-05-25 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL log file path: /dmD/data/PRODD/PRODD01.log log file path: /dmD/data/PRODD/PRODD02.log write to dir [/dmD/data/PRODD]. create dm database success. 2022-08-30 10:54:19
复制
4. PRODE实例创建和启动
[dmdba@gs08 bin]$ ./dminit PATH=/dmE/data DB_NAME=PRODE instance_name=PRODE SYSDBA_PWD=Dameng123 PORT_NUM=5241 CASE_SENSITIVE=Y LENGTH_IN_CHAR=1 UNICODE_FLAG=0 initdb V8 db version: 0x7000c file dm.key not found, use default license! License will expire on 2023-05-25 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL log file path: /dmE/data/PRODE/PRODE01.log log file path: /dmE/data/PRODE/PRODE02.log write to dir [/dmE/data/PRODE]. create dm database success. 2022-08-30 10:54:48
复制
5. PRODF实例创建和启动
[dmdba@gs08 bin]$ ./dminit PATH=/dmF/data DB_NAME=PRODF instance_name=PRODF SYSDBA_PWD=Dameng123 PORT_NUM=5242 CASE_SENSITIVE=Y LENGTH_IN_CHAR=1 UNICODE_FLAG=1 initdb V8 db version: 0x7000c file dm.key not found, use default license! License will expire on 2023-05-25 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL log file path: /dmF/data/PRODF/PRODF01.log log file path: /dmF/data/PRODF/PRODF02.log write to dir [/dmF/data/PRODF]. create dm database success. 2022-08-30 10:56:18
复制
6.注册服务
[root@gs08 root]# cd /home/dmdba/dmdbms/script/root/ [root@gs08 root]# ./dm_service_installer.sh -t dmserver -p PRODC -dm_ini /dmC/data/PRODC/dm.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicePRODC.service to /usr/lib/systemd/system/DmServicePRODC.service. 创建服务(DmServicePRODC)完成 [root@gs08 root]# ./dm_service_installer.sh -t dmserver -p PRODD -dm_ini /dmD/data/PRODD/dm.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicePRODD.service to /usr/lib/systemd/system/DmServicePRODD.service. 创建服务(DmServicePRODD)完成 [root@gs08 root]# ./dm_service_installer.sh -t dmserver -p PRODE -dm_ini /dmE/data/PRODE/dm.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicePRODE.service to /usr/lib/systemd/system/DmServicePRODE.service. 创建服务(DmServicePRODE)完成 [root@gs08 root]# ./dm_service_installer.sh -t dmserver -p PRODF -dm_ini /dmF/data/PRODF/dm.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicePRODF.service to /usr/lib/systemd/system/DmServicePRODF.service. 创建服务(DmServicePRODF)完成
复制
6.1查看注册的服务并启动
[dmdba@gs08 bin]$ ll |grep Dm -rwxr-xr-x 1 dmdba dinstall 13833 Aug 18 12:22 DmAPService -rwxr-xr-x 1 dmdba dinstall 14497 Aug 18 12:22 DmAuditMonitorService -rwxr-xr-x 1 dmdba dinstall 13661 Aug 18 12:22 DmInstanceMonitorService -rwxr-xr-x 1 dmdba dinstall 14134 Aug 18 12:22 DmJobMonitorService -rwxr-xr-x 1 dmdba dinstall 16461 Aug 18 13:31 DmServiceDMTEST -rwxr-xr-x 1 dmdba dinstall 16459 Aug 29 13:17 DmServicePRODA -rwxr-xr-x 1 dmdba dinstall 16460 Aug 29 13:22 DmServicePRODB -rwxr-xr-x 1 dmdba dinstall 16459 Aug 30 10:57 DmServicePRODC -rwxr-xr-x 1 dmdba dinstall 16459 Aug 30 10:58 DmServicePRODD -rwxr-xr-x 1 dmdba dinstall 16459 Aug 30 10:58 DmServicePRODE -rwxr-xr-x 1 dmdba dinstall 16459 Aug 30 10:58 DmServicePRODF [dmdba@gs08 bin]$ ./DmServicePRODC start Starting DmServicePRODC: [ OK ] [dmdba@gs08 bin]$ ./DmServicePRODD start Starting DmServicePRODD: [ OK ] [dmdba@gs08 bin]$ ./DmServicePRODE start Starting DmServicePRODE: [ OK ] [dmdba@gs08 bin]$ ./DmServicePRODF start Starting DmServicePRODF: [ OK ]
复制
第一组测试
LENGTH_IN_CHAR=0和UNICODE_FLAG=0
[dmdba@gs08 bin]$ ./disql sysdba/Dameng123:5239 服务器[LOCALHOST:5239]:处于普通打开状态 登录使用时间 : 1.544(ms) disql V8 SQL> select name,instance_name,status$ from v$instance; 行号 NAME INSTANCE_NAME STATUS$ ---------- ----- ------------- ------- 1 PRODC PRODC OPEN SQL> select name, value from SYS."V$PARAMETER" t where t.NAME='LENGTH_IN_CHAR'; 行号 NAME VALUE ---------- -------------- ----- 1 LENGTH_IN_CHAR 0 已用时间: 3.681(毫秒). 执行号:55203. SQL> SELECT name, value FROM v$parameter WHERE name like '%GLOBAL_CHARSET%'; 行号 NAME VALUE ---------- -------------- ----- 1 GLOBAL_CHARSET 0 SQL> create table test(c1 varchar(10)); 操作已执行 已用时间: 8.031(毫秒). 执行号:55205.
复制
- 插入10个字母
SQL> insert into test(c1) values('ABCDEFGHIJ'); 影响行数 1 已用时间: 0.597(毫秒). 执行号:55206. 插入11个字母报错 insert into test(c1) values('ABCDEFGHIJA'); [-6169]:列[C1]长度超出定义. 已用时间: 0.374(毫秒). 执行号:0.
复制
- 插入5个汉字
SQL> insert into test(c1) values('测试一下测'); 影响行数 1 已用时间: 1.240(毫秒). 执行号:55208.
复制
- 插入6个中文报错误
SQL> insert into test(c1) values('测试一下测试'); insert into test(c1) values('测试一下测试'); [-6169]:列[C1]长度超出定义. 已用时间: 0.393(毫秒). 执行号:0.
复制
第二组测试
LENGTH_IN_CHAR=0和UNICODE_FLAG=1
[dmdba@gs08 bin]$ ./disql sysdba/Dameng123:5240 服务器[LOCALHOST:5240]:处于普通打开状态 登录使用时间 : 1.340(ms) disql V8 SQL> select name,instance_name,status$ from v$instance; 行号 NAME INSTANCE_NAME STATUS$ ---------- ----- ------------- ------- 1 PRODD PRODD OPEN 已用时间: 2.037(毫秒). 执行号:55400. SQL> select name, value from SYS."V$PARAMETER" t where t.NAME='LENGTH_IN_CHAR'; 行号 NAME VALUE ---------- -------------- ----- 1 LENGTH_IN_CHAR 0 已用时间: 3.348(毫秒). 执行号:55401. SQL> SELECT name, value FROM v$parameter WHERE name like '%GLOBAL_CHARSET%'; 行号 NAME VALUE ---------- -------------- ----- 1 GLOBAL_CHARSET 1 已用时间: 3.291(毫秒). 执行号:55402. SQL> create table test(c1 varchar(10)); 操作已执行 已用时间: 9.866(毫秒). 执行号:55403.
复制
1.插入10个英文,正常
SQL> insert into test(c1) values('ABCDEFGHIJ'); 影响行数 1 已用时间: 0.555(毫秒). 执行号:55404.
复制
2.插入11个英文,错误
SQL> insert into test(c1) values('ABCDEFGHIJA'); insert into test(c1) values('ABCDEFGHIJA'); [-6169]:列[C1]长度超出定义. 已用时间: 0.373(毫秒). 执行号:0.
复制
3.插入3个中文,正常
SQL> insert into test(c1) values('测试一'); 影响行数 1 已用时间: 0.354(毫秒). 执行号:55406.
复制
4.插入3个中文1个英文,正常
SQL> insert into test(c1) values('测试一A'); 影响行数 1 已用时间: 0.389(毫秒). 执行号:55407.
复制
5.插入4个中文,错误
SQL> insert into test(c1) values('测试一下'); insert into test(c1) values('测试一下'); [-6169]:列[C1]长度超出定义. 已用时间: 0.380(毫秒). 执行号:0.
复制
6.插入3个中文2个英文,错误
SQL> insert into test(c1) values('测试一AB'); insert into test(c1) values('测试一AB'); [-6169]:列[C1]长度超出定义. 已用时间: 0.378(毫秒). 执行号:0.
复制
第三组测试
LENGTH_IN_CHAR=1和UNICODE_FLAG=0
[dmdba@gs08 bin]$ ./disql sysdba/Dameng123:5241 服务器[LOCALHOST:5241]:处于普通打开状态 登录使用时间 : 1.369(ms) disql V8 SQL> select name,instance_name,status$ from v$instance; 行号 NAME INSTANCE_NAME STATUS$ ---------- ----- ------------- ------- 1 PRODE PRODE OPEN 已用时间: 1.961(毫秒). 执行号:55400. SQL> select name, value from SYS."V$PARAMETER" t where t.NAME='LENGTH_IN_CHAR'; 行号 NAME VALUE ---------- -------------- ----- 1 LENGTH_IN_CHAR 1 已用时间: 3.492(毫秒). 执行号:55401. SQL> SELECT name, value FROM v$parameter WHERE name like '%GLOBAL_CHARSET%'; 行号 NAME VALUE ---------- -------------- ----- 1 GLOBAL_CHARSET 0 已用时间: 3.245(毫秒). 执行号:55402. SQL> create table test(c1 varchar(10)); 操作已执行 已用时间: 7.298(毫秒). 执行号:55403.
复制
1.插入10个英文,正常
SQL> insert into test(c1) values('ABCDEFGHIJ'); 影响行数 1 已用时间: 0.582(毫秒). 执行号:55404.
复制
2.插入11个英文,正常
SQL> insert into test(c1) values('ABCDEFGHIJA'); 影响行数 1 已用时间: 0.365(毫秒). 执行号:55405.
复制
3.插入20个英文,正常
SQL> insert into test(c1) values('ABCDEFGHIJABCDEFGHIJ'); 影响行数 1 已用时间: 0.383(毫秒). 执行号:55406.
复制
4.插入21个英文,错误
SQL> insert into test(c1) values('ABCDEFGHIJABCDEFGHIJA'); insert into test(c1) values('ABCDEFGHIJABCDEFGHIJA'); [-6169]:列[C1]长度超出定义. 已用时间: 0.390(毫秒). 执行号:0.
复制
5.插入10个中文,正常
SQL> insert into test(c1) values('测试一下测试一下测试'); 影响行数 1 已用时间: 0.424(毫秒). 执行号:55408.
复制
6.插入11个中文,错误
SQL> insert into test(c1) values('测试一下测试一下测试一'); insert into test(c1) values('测试一下测试一下测试一'); [-6169]:列[C1]长度超出定义. 已用时间: 0.374(毫秒). 执行号:0.
复制
7.插入10个中文1个英文,错误
SQL> insert into test(c1) values('测试一下测试一下测试A'); insert into test(c1) values('测试一下测试一下测试A'); [-6169]:列[C1]长度超出定义. 已用时间: 0.397(毫秒). 执行号:0.
复制
第四组测试
LENGTH_IN_CHAR=1和UNICODE_FLAG=1
SQL> select name,instance_name,status$ from v$instance; 行号 NAME INSTANCE_NAME STATUS$ ---------- ----- ------------- ------- 1 PRODF PRODF OPEN 已用时间: 2.116(毫秒). 执行号:55400. SQL> select name, value from SYS."V$PARAMETER" t where t.NAME='LENGTH_IN_CHAR'; 行号 NAME VALUE ---------- -------------- ----- 1 LENGTH_IN_CHAR 1 已用时间: 4.031(毫秒). 执行号:55401. SQL> SELECT name, value FROM v$parameter WHERE name like '%GLOBAL_CHARSET%'; 行号 NAME VALUE ---------- -------------- ----- 1 GLOBAL_CHARSET 1 已用时间: 4.043(毫秒). 执行号:55402. SQL> create table test(c1 varchar(10)); 操作已执行 已用时间: 11.234(毫秒). 执行号:55403.
复制
1.插入10个英文,正常
SQL> insert into test(c1) values('ABCDEFGHIJ'); 影响行数 1 已用时间: 0.563(毫秒). 执行号:55404.
复制
2.插入20个英文,正常
SQL> insert into test(c1) values('ABCDEFGHIJABCDEFGHIJ'); 影响行数 1 已用时间: 0.378(毫秒). 执行号:55405.
复制
3.插入40个英文,正常
SQL> insert into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ'); 影响行数 1 已用时间: 0.408(毫秒). 执行号:55406.
复制
4.插入41个英文,错误
SQL> insert into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA'); insert into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA'); [-6169]:列[C1]长度超出定义. 已用时间: 0.373(毫秒). 执行号:0.
复制
5.插入10个中文,正常
SQL> insert into test(c1) values('测试一下测试一下测试'); 影响行数 1 已用时间: 0.373(毫秒). 执行号:55408.
复制
6.插入13个中文,正常
SQL> insert into test(c1) values('测试一下测试一下测试一下测'); 影响行数 1 已用时间: 0.430(毫秒). 执行号:55409.
复制
7.插入14个中文,错误
SQL> insert into test(c1) values('测试一下测试一下测试一下测试'); insert into test(c1) values('测试一下测试一下测试一下测试'); [-6169]:列[C1]长度超出定义. 已用时间: 0.375(毫秒). 执行号:0.
复制
8.插入13个中文1个英文,正常
SQL> insert into test(c1) values('测试一下测试一下测试一下测A'); 影响行数 1 已用时间: 0.391(毫秒). 执行号:55411.
复制
9.插入13个中文2个英文,错误
SQL> insert into test(c1) values('测试一下测试一下测试一下测AB'); insert into test(c1) values('测试一下测试一下测试一下测AB'); [-6169]:列[C1]长度超出定义. 已用时间: 0.379(毫秒). 执行号:0.
复制
小结
参考链接:https://eco.dameng.com/document/dm/zh-cn/start/
评论

