深入理解LENGTH_IN_CHAR和CHARSET的影响情况

LENGTH_IN_CHAR

LENGTH_IN_CHAR(默认以字节为单位进行存储):

1(Y/y):是,以字符为单位进行存储,设置为以字符为单位时,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。

0(N/n):否,以字节为单位进行存储,所有 VARCHAR 类型对象的长度以字节为单位。

CHARSET    

CHARSET/UNICODE_FLAG(默认为 0):

字符集选项。取值:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。

CHARSET=0代表使用GB18030,即1个中文2个字节。CHARSET=1代表使用UTF-8,即1个中文3个字节。

对比LENGTH_IN_CHAR和CHARSET取值不同的情况

LENGTH_IN_CHAR=0,CHARSET=0

初始化实例并启动服务

初始化实例TEST1

输入:

./dminit path=/dmdata/data/ DB_NAME=TEST1 instance_name=TEST1 port_num=5237 LENGTH_IN_CHAR=0 CHARSET=0

如下图所示:

创建服务(用root用户进入/home/dmdba/dmdbms/script/root)

输入:

./dm_service_installer.sh -t dmserver -p TEST1 -dm_ini /dmdata/data/TEST1/dm.ini

如下图所示:

启动服务(用dmdba用户进入/home/dmdba/dmbms/bin)

输入:

./DmServiceTEST1 start

如下图所示:

测试

连接数据库(使用dmdba用户进入/home/dmdba/dmdbms/bin)

输入:

./disql SYSDBA/SYSDBA:5237

如下图所示:

查看数据库名称、状态、LENGTH_IN_CHAR和CHARSET参数的值

输入:

select name,instance_name,status$ from v$instance;

select unicode;

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

如下图所示:

输入:

CREATE TABLE TEST(ID INT,NAME VARCHAR(8));

如下图所示:

输入:

INSERT INTO TEST VALUES(1,'达梦');

如下图所示:

输入:

INSERT INTO TEST VALUES(2,'达梦数');

如下图所示:

输入:

INSERT INTO TEST VALUES(3,'达梦数据');

如下图所示:

输入:

INSERT INTO TEST VALUES(4,'达梦数据库');

如下图所示:

输入:

INSERT INTO TEST VALUES(4,'达梦数据D');

如下图所示:

输入:

SELECT DATA_LENGTH,NAME,LENGTH(NAME),LENGTHB(NAME) FROM TEST,DBA_TAB_COLUMNS WHERE TABLE_NAME='TEST' AND COLUMN_NAME='NAME';

如下图所示:

总结

LENGTH_IN_CHAR=0,CHARSET=0总结:可以看出在字段长度为9时就报错超出长度,只存储了4个中文字符。

LENGTH_IN_CHAR=1,CHARSET=0

初始化实例并启动服务

初始化实例TEST2

输入:

./dminit path=/dmdata/data/ DB_NAME=TEST2 instance_name=TEST2 port_num=5238 LENGTH_IN_CHAR=1 CHARSET=0

如下图所示:

创建服务(用root用户进入/home/dmdba/dmdbms/script/root)

输入:

./dm_service_installer.sh -t dmserver -p TEST2 -dm_ini /dmdata/data/TEST2/dm.ini

如下图所示:

启动服务(用dmdba用户进入/home/dmdba/dmbms/bin)

输入:

./DmServiceTEST2 start

如下图所示:

测试

连接数据库(使用dmdba用户进入/home/dmdba/dmdbms/bin)

输入:

./disql SYSDBA/SYSDBA:5238

如下图所示:

查看数据库名称、状态、LENGTH_IN_CHAR和CHARSET参数的值

输入:

select name,instance_name,status$ from v$instance;

select unicode;

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

如下图所示:

输入:

CREATE TABLE TEST(ID INT,NAME VARCHAR(8));

如下图所示:

输入:

INSERT INTO TEST VALUES(1,'达梦');

如下图所示:

输入:

INSERT INTO TEST VALUES(2,'达梦数');

如下图所示:

输入:

INSERT INTO TEST VALUES(3,'达梦数据');

如下图所示:

输入:

INSERT INTO TEST VALUES(4,'达梦数据库');

如下图所示:

输入:

INSERT INTO TEST VALUES(5,'达梦数据库达');

如下图所示:

输入:

INSERT INTO TEST VALUES(6,'达梦数据库达梦');

如下图所示:

输入:

INSERT INTO TEST VALUES(7,'达梦数据库达梦数');

如下图所示:

输入:

INSERT INTO TEST VALUES(8,'达梦数据库达梦数据');

如下图所示:

输入:

INSERT INTO TEST VALUES(8,'达梦数据库达梦数D');

如下图所示:

输入:

SELECT DATA_LENGTH,NAME,LENGTH(NAME),LENGTHB(NAME) FROM TEST,DBA_TAB_COLUMNS WHERE TABLE_NAME='TEST' AND COLUMN_NAME='NAME';

如下图所示:

总结

LENGTH_IN_CHAR=1,CHARSET=0总结:可以看出在字段NAME可以存储8个中文字符,实际最大存储长度为16,是长度定义的2倍。

LENGTH_IN_CHAR=0,CHARSET=1

初始化实例并启动服务

初始化实例TEST3

输入:

./dminit path=/dmdata/data/ DB_NAME=TEST3 instance_name=TEST3 port_num=5239 LENGTH_IN_CHAR=0 CHARSET=1

如下图所示:

创建服务(用root用户进入/home/dmdba/dmdbms/script/root)

输入:

./dm_service_installer.sh -t dmserver -p TEST3 -dm_ini /dmdata/data/TEST3/dm.ini

如下图所示:

启动服务(用dmdba用户进入/home/dmdba/dmbms/bin)

输入:

./DmServiceTEST3 start

如下图所示:

测试

连接数据库(使用dmdba用户进入/home/dmdba/dmdbms/bin)

输入:

./disql SYSDBA/SYSDBA:5239

如下图所示:

查看数据库名称、状态、LENGTH_IN_CHAR和CHARSET参数的值

输入:

select name,instance_name,status$ from v$instance;

select unicode;

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

如下图所示:

输入:

CREATE TABLE TEST(ID INT,NAME VARCHAR(8));

如下图所示:

输入:

INSERT INTO TEST VALUES(1,'达梦');

如图所示:

输入:

INSERT INTO TEST VALUES(2,'达梦数');

如图所示:

输入:

INSERT INTO TEST VALUES(2,'达梦D');

如图所示:

输入:

INSERT INTO TEST VALUES(3,'达梦DM');

如图所示:

输入:

INSERT INTO TEST VALUES(4,'达梦DMD');

如图所示:

输入:

SELECT DATA_LENGTH,NAME,LENGTH(NAME),LENGTHB(NAME) FROM TEST,DBA_TAB_COLUMNS WHERE TABLE_NAME='TEST' AND COLUMN_NAME='NAME';

如下图所示:

总结

LENGTH_IN_CHAR=0,CHARSET=1总结:可以看出在CHARSET=1的情况下,一个中文占用3个字符,NAME只能存储两个中文两个英文字符,总长度8。

LENGTH_IN_CHAR=1,CHARSET=1

初始化实例并启动服务

初始化实例TEST4

输入:

./dminit path=/dmdata/data/ DB_NAME=TEST4 instance_name=TEST4 port_num=5240 LENGTH_IN_CHAR=1 CHARSET=1

如下图所示:

创建服务(用root用户进入/home/dmdba/dmdbms/script/root)

输入:

./dm_service_installer.sh -t dmserver -p TEST4 -dm_ini /dmdata/data/TEST4/dm.ini

如下图所示:

启动服务(用dmdba用户进入/home/dmdba/dmbms/bin)

输入:

./DmServiceTEST4 start

如下图所示:

测试

连接数据库(使用dmdba用户进入/home/dmdba/dmdbms/bin)

输入:

./disql SYSDBA/SYSDBA:5240

如下图所示:

查看数据库名称、状态、LENGTH_IN_CHAR和CHARSET参数的值

输入:

select name,instance_name,status$ from v$instance;

select unicode;

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

如下图所示:

输入:

CREATE TABLE TEST(ID INT,NAME VARCHAR(8));

如下图所示:

输入:

INSERT INTO TEST VALUES(1,'达梦DM');

如图所示:

输入:

INSERT INTO TEST VALUES(2,'达梦数');

如图所示:

输入:

INSERT INTO TEST VALUES(3,'达梦数据');

如图所示:

输入:

INSERT INTO TEST VALUES(4,'达梦数据库');

如图所示:

输入:

INSERT INTO TEST VALUES(5,'达梦数据库达');

如图所示:

输入:

INSERT INTO TEST VALUES(6,'达梦数据库达梦');

如图所示:

输入:

INSERT INTO TEST VALUES(7,'达梦数据库达梦数');

如图所示:

输入:

INSERT INTO TEST VALUES(8,'达梦数据库达梦数据');

如图所示:

输入:

INSERT INTO TEST VALUES(9,'达梦数据库达梦数据库');

如图所示:

输入:

INSERT INTO TEST VALUES(10,'达梦数据库达梦数据库达');

如图所示:

输入:

INSERT INTO TEST VALUES(10,'达梦数据库达梦数据库D');

如图所示:

输入:

INSERT INTO TEST VALUES(11,'达梦数据库达梦数据库DM');

如图所示:

输入:

INSERT INTO TEST VALUES(12,'达梦数据库达梦数据库DMD');

如图所示:

输入:

SELECT DATA_LENGTH,NAME,LENGTH(NAME),LENGTHB(NAME) FROM TEST,DBA_TAB_COLUMNS WHERE TABLE_NAME='TEST' AND COLUMN_NAME='NAME';

如下图所示:

总结

LENGTH_IN_CHAR=1,CHARSET=1总结:可以看出,在CHARSET=1,可以存储3个中文字符的情况下,LENGTH_IN_CHAR=1,最终NAME字段实际存储长度为32,为定义长度的4倍。

总结

字段定义长度

LENGTH_IN_CHAR

CHARSET

实际字节数

VARCHAR(8)

0

0 GB18030

8

VARCHAR(8)

1

0 GB18030

16

VARCHAR(8)

0

1 UTF-8

8

VARCHAR(8)

1

1 UTF-8

32

结论:

(1)GB18030中文占2各字符,UTF-8中文占3个字符;英文均只占一个字符。

(2)开启LENGTH_IN_CHAR后如果字符集为GB18030,则VARCAHR会自动扩充字节至2倍;如果字符集为UTF-8,则会自动扩充至最大长度的4倍。

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值