天天看点

达梦数据库字符集与varchar长度单位选择达梦数据库字符集与varchar长度单位选择

达梦数据库字符集与varchar长度单位选择

在学习这之前我们先介绍达梦数据库中两个重要参数。

LENGTH_IN_CHAR:VARCHAR 类型对象的长度是否以字符为单位。1:是,设置为以字符为单位时,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。同时,存储的字节长度 8188 上限仍然不变,也就是说,即使定义列长度为8188 字符,其实际能插入的字符串占用总字节长度仍然不能超过 8188;0:否,所有 VARCHAR 类型对象的长度以字节为单位。其取值 0 或 1。默认值为 0

CHARSET(UNICODE_FLAG):字符集选项。0 代表 GB18030,1 代表UTF-8,2 代表韩文字符集 EUC-KR。(这里只讨论前两种类型)

varchar数据类型是指的非定长字符串,用法类似char数据类型,可以指定一个不超过8188的正整数作为字符长度,例如:varchar(100)。如果未指定长度,缺省为8188。在基表中,当没有指定USINGLONG ROW 存储选项时,插入varchar数据类型的实际最大存储长度由数据库页面大小决定。

在使用DMINIT初始化数据库的时候,有两个参数CHARSET和LENGTH_IN_CHAR跟字符集相关。

CHARSET:此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。需要注意的是,数据库一旦初始化完成,字符集就将无法修改。我们可以使用select unicode来查询当前数据库的字符集种类,0代表gb18030,1代表UTF8。

LENGTH_IN_CHAR:此参数决定了,数据库中的varchar类型对象的长度是否以字符为单位。取值为1则设置为以字符为单位,将存储长度值按照理论字符长度进行放大。取值为0则所有varchar类型对象的长度以字节为单位。

1.LENGTH_IN_CHAR=0,CHARSET=1(字符集是utf-8,长度以字节为单位)

create table test(ca varchar(1));
insert into test values('1');
insert into test values('我'); -- 列[NAME]长度超出定义.
           

查看表数据、数据长度和字节长度

select ca,LENGTH(ca),LENGTHB(ca) from test;
           
达梦数据库字符集与varchar长度单位选择达梦数据库字符集与varchar长度单位选择
create table test(ca varchar(3));
insert into test values('aaa');
insert into test values('我');
insert into test values('我们'); -- 列[NAME]长度超出定义.
           

查看表数据、数据长度和字节长度

select ca,LENGTH(ca),LENGTHB(ca) from test;
           
达梦数据库字符集与varchar长度单位选择达梦数据库字符集与varchar长度单位选择

小结:当字符集为utf-8,长度以字节为单位时,一个汉字占三个字节,一个英文字母占一个字节。

2.LENGTH_IN_CHAR=1,CHARSET=1(字符集是utf-8,长度以字符为单位)

create table test(ca varchar(1));
insert into test values('a');
insert into test values('aaa');
insert into test values('aaaa');
insert into test values('aaaaa'); -- 列[NAME]长度超出定义.
insert into test values('我');
insert into test values('我们'); -- 列[NAME]长度超出定义.
           

查看表数据、数据长度和字节长度

select ca,LENGTH(ca),LENGTHB(ca) from test;
           
达梦数据库字符集与varchar长度单位选择达梦数据库字符集与varchar长度单位选择

小结:当字符集为utf-8,长度以字符为单位时,一个汉字占三个字节,一个英文字母占一个字节,一个字符四个字节(即一个varchar单位占四个字节),可以存四个英文字母。

3.LENGTH_IN_CHAR=1,CHARSET=0(字符集是gb18030,长度以字符为单位)

create table test(name varchar(3));
insert into test values('我');
insert into test values('我们');
insert into test values('我们的');
insert into test values('我们的家');-- 列[NAME]长度超出定义.
insert into test values('aaa');
insert into test values('aaaab');
insert into test values('aaaabb');
insert into test values('aaaabbb');-- 列[NAME]长度超出定义.
           

查看表数据、数据长度和字节长度

select name,LENGTH(name),LENGTHB(name) from test;
           
达梦数据库字符集与varchar长度单位选择达梦数据库字符集与varchar长度单位选择

小结:当字符集为gb18030,长度以字符为单位时,一个汉字占两个字节一个字符,一个英文字母占一个字节,一个字符可以存一个汉字或者两个英文字母。

4.LENGTH_IN_CHAR=0,CHARSET=0(字符集是gb18030,长度以字节为单位)

create table test(name varchar(3));
insert into test values('我');
insert into test values('aaa');
insert into test values('我们');-- 列[NAME]长度超出定义.
insert into test values('我们的');-- 列[NAME]长度超出定义.
           

查看表数据、数据长度和字节长度

select name,LENGTH(name),LENGTHB(name) from test;
           

小结:当字符集为gb18030,长度以字节为单位时,一个汉字占两个字节,一个英文字母占一个字节。

由此可见,在达梦数据库中以utf-8为字符集时,一个字符=四个字节,一个英文字母占一个字节,一个汉字占三个字节;以gb18030为字符集时,一个字符=两个字节,一个英文字母占一个字节,一个汉字占两个字节。