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倍。