干货分享DM数据库varchar类型长度解析

Posted 达梦大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货分享DM数据库varchar类型长度解析相关的知识,希望对你有一定的参考价值。




我们在数据迁移或是往数据表中导入中文字符时,经常会出现varchar类型超过字符长度的报错,可是我们一看长度是够啊,怎么会报错,错在那里?今天我们就来分析一下varchar数据类型长度的占比。


在说varchar类型之前先来说说char数据类型。char类型是指定长的字符串。在基表中,定义char类型的列时,其最大存储长度由数据库页面大小决定,可以指定一个不超过其最大存储长度的正整数作为字符长度,例如:char(100)。如果未指定长度,缺省为1。char数据类型最大存储长度和页面大小有关,但是,在表达式计算中,该类型的长度上限不受页面大小限制为32767。


char最大存储长度和页面大小的对应关系
数据库页面大小 实际最大长度
4K 1900
8K 3900
16K 8000
32K 8188

这个限制长度只针对建表的情况,在定义变量的时候,可以不受这个限制长度的限制。


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


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


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


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


测试环境

操作系统:中标麒麟6.0

数据库系统:DM v8.1





【干货分享】DM数据库varchar类型长度解析





01

第一种情况




当LENGTH_IN_CHAR=0,UNICODE_FLAG=1时

(字符集是utf-8,长度以字节为单位)





【干货分享】DM数据库varchar类型长度解析




1.创建dm01test表并插入数据

SQL> create table dm01test(namevarchar(1));SQL> insert into dm01testvalues('1');SQL>insert into dm01testvalues('我');





【干货分享】DM数据库varchar类型长度解析







【干货分享】DM数据库varchar类型长度解析




2.查询dm01test表中的数据和数据长度length及数据所占的字节数lengthb




【干货分享】DM数据库varchar类型长度解析




3.创建dm01test2表并插入数据

SQL> create table dm01test2(namevarchar(3));SQL>insert into dm01test2values('aaa');SQL> insert into dm01test2values('我');SQL> insert into dm01test2values('我们');



【干货分享】DM数据库varchar类型长度解析




4.查询dm01test表中的数据和数据长度length及数据所占的字节数lengthb





【干货分享】DM数据库varchar类型长度解析




5.总结:

当参数UNICODE_FLAG=1、LENGTH_IN_CHAR=0时。Utf8一个汉字占用三个字节,所有标点符号均占三个字节、一个英文占用一个字节。varchar以字节为单位,一个varchar等于一个字节。

【干货分享】DM数据库varchar类型长度解析


02

第二种情况




当LENGTH_IN_CHAR=1,UNICODE_FLAG=1时

(字符集是utf-8,长度以字符为单位)




【干货分享】DM数据库varchar类型长度解析




1.创建dm02test表并插入数据

SQL> create table dm02test(namevarchar(1));SQL> insert into dm02testvalues('我');SQL> insert into dm02testvalues('a');




【干货分享】DM数据库varchar类型长度解析




2.查询dm02test表中的数据和数据长度length及数据所占的字节数lengthb





【干货分享】DM数据库varchar类型长度解析




3.创建dm02test2表并插入数据

SQL> insert into dm02test2values('我们');SQL> insert into dm02test2values('aaaa');SQL> insert into dm02test2values('我们的');SQL> insert into dm02test2values('我们的家');SQL> insert into dm02test2values('我们的家和');



【干货分享】DM数据库varchar类型长度解析




SQL> insert into dm02test2values('123456789012');SQL> insert into dm02test2values('1234567890123');



【干货分享】DM数据库varchar类型长度解析




4.查询dm01test表中的数据和数据长度length及数据所占的字节数lengthb





【干货分享】DM数据库varchar类型长度解析




5.总结:

由图结果可以看出,当参数UNICODE_FLAG=1、LENGTH_IN_CHAR=1时,varchar表示4个字节,因编码为uft8,一个汉字占用三个字节。所以varchar长度为3时,实际可以录入4个汉字(3*4=12),12个英文字符。

【干货分享】DM数据库varchar类型长度解析


03

第三种情况




当LENGTH_IN_CHAR=0,UNICODE_FLAG=0时

(字符集是gb18030,长度以字符为单位)





【干货分享】DM数据库varchar类型长度解析




1.创建表:

SQL> create table test2(namevarchar(3));


2.录入相应的数据,查询test2表中的数据和数据长度length及数据所占的字节数lengthb。





【干货分享】DM数据库varchar类型长度解析




3.总结

当字符集是gb18030,长度以字符为单位时,一个汉字占两个字节,一个英文字符占一个字节。varchar表示2个字节,因编码为gb18030,一个汉字占用两个字节。所以varchar长度为3时,实际可以录入2个汉字(2*3=6),6个英文字符。

【干货分享】DM数据库varchar类型长度解析



04

第四种情况



当LENGTH_IN_CHAR=1,UNICODE_FLAG=0时

(字符集是gb18030,长度以字节为单位)




【干货分享】DM数据库varchar类型长度解析




1.创建表:

SQL> create table test2(namevarchar(3));


2.录入相应的数据,查询test2表中的数据和数据长度length及数据所占的字节数lengthb。





【干货分享】DM数据库varchar类型长度解析





3.总结

当字符集是gb18030,长度以字节为单位时,一个汉字占两个字节,一个英文字符占一个字节。Varchar(1)表示1个字节,因编码为gb18030,一个汉字占用两个字节。所以varchar长度为3时,实际可以录入1个汉字(1*3=3),3个英文字符。

【干货分享】DM数据库varchar类型长度解析



总结汇总表

【干货分享】DM数据库varchar类型长度解析

好了

今天varchar的类型的解析分享就到这里了

我们下期再见! 



往期回顾




以上是关于干货分享DM数据库varchar类型长度解析的主要内容,如果未能解决你的问题,请参考以下文章

干货分享:7000字总结Redis原理解析,让你从0-1

ORACLE中varchar类型的最大长度是多少

Oracle 数据怎么实时同步到 DM DB 达梦数据库 | 亲测干货建议收藏

SQLSERVER中nvarchar和varchar类型的区别是啥?

SQL Server中char与varchar数据类型区别

源码时代前端干货分享| JavaScript编程优化,超强入门必备技能!