暂无图片
暂无图片
暂无图片
暂无图片
1
暂无图片

对达梦数据库LENGTH_IN_CHAR和CHARSET参数的探讨

原创 dbtiger 2022-10-19
2875

这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.
复制
  1. 插入10个字母
SQL> insert into test(c1) values('ABCDEFGHIJ');
影响行数 1
已用时间: 0.597(毫秒). 执行号:55206.
插入11个字母报错
insert into test(c1) values('ABCDEFGHIJA');
[-6169]:列[C1]长度超出定义.
已用时间: 0.374(毫秒). 执行号:0.
复制
  1. 插入5个汉字
SQL> insert into test(c1) values('测试一下测');
影响行数 1

已用时间: 1.240(毫秒). 执行号:55208.
复制
  1. 插入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.
复制

小结

image.png

参考链接:https://eco.dameng.com/document/dm/zh-cn/start/

image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

暂无图片
达梦产品与服务
暂无图片
2年前
评论
暂无图片 1
您好,达梦在线服务平台正在举办《第一届达梦数据库技术征文大赛》,奖品多多,诚邀您参加活动:https://eco.dameng.com/community/post/ec2466c7aaba20c47952e4dba7886876
2年前
暂无图片 1
评论