DM的汉字存储

一、简介

DM数据库在进行汉字处理的时候,会用到varchar的数据类型,默认是以字节为单位。如果数据库的字符集为GB18030,那一个中文汉字占用两个字节;如果数据库的字符集为UTF-8,那一个中文汉字占用三个字节。如果数据库是以字符为单位,会有什么不同结果

二、参数介绍

charset:表示数据库中所有数据的字符集,初始化的时候进行设置,一旦初始化完成,字符集将无法修改,默认字符集为GB18030(例如:GB18030、UTF-8)

length_in_char:表示varchar类型对象的长度是否以字符为单位。当设置为1时以字符长度为单位,定义的长度并非真正按照字符长度调整,而是将存储长度按照理论字符长度进行放大,会出现实际可插入字符数超过定义长度的情况,存储的字节长度为8188上限仍不变;当设置为0时以字节为单位进行存储。

三、案例测试

例一:charset=0   length_in_char=0

create  table  pp(id int,name varchar(3));

insert  into  pp  values(‘平‘);     --执行成功

insert  into  pp  values(‘平a‘);    --执行成功

insert  into  pp  values(‘平安‘);   --name列超出定义

说明:字符集为GB18030的情况下,一个汉字占用两个字节,所以可以插入一个汉字及字母,插入两个汉字即报错

例二:charset=1    length_in_char=0

create  table  pp(id int,name varchar(3));

insert  into  pp  values(‘平‘);     --执行成功

insert  into  pp  values(‘平a‘);    --name列超出定义

insert  into  pp  values(‘平安‘);   --name列超出定义

说明:字符集为UTF-8的情况下,一个汉字一般需要占用三个字节,所以varchar(3)只能插入一个汉字。

例三:charset=0   length_in_char=1  

insert  into  pp  values(‘平‘);        --执行成功

insert  into  pp  values(‘平安‘);      --执行成功

insert  into  pp  values(‘平安中‘);    --执行成功

insert  into  pp  values(‘平安中国‘);  --name列超出定义

说明:length_in_char=1的情况下,varchar类型的实际存储会按一定的比例放大。当字符集为GB18030时,varchar(3)的实际存储是3个汉字,也就是3*2=6个字节的数据。

例四:charset=1    length_in_char=1

create  table  pp(id int,name varchar(3));

insert  into  pp  values(1,’平’);          --执行成功

insert  into  pp  values(1,’平安’);        --执行成功

insert  into  pp  values(1,’平安中’);      --执行成功

insert  into  pp  values(1,’平安中心’);    --执行成功

insert  into  pp  values(1,’平安中心哈’);  --name列超出定义

insert  into  pp  values(1,’平安中心a’);   --name列超出定义

说明:DM数据库中实际存储数据是以字节为单位,在charset=1并且length_in_char=1的情况下varchar类型对象的实际存储的最大长度为定义的长度*4个字节。所以varchar(3)可以存储的实际数据为3*4=12个字节为4个汉字。

结论:

1)length_in_char=0  varchar类型是以字节为单位进行存储,当字符集为GB18030时一个汉字占用两个字节;当字符集为UTF-8时一个汉字占用三个字节。

2)length_in_char=1  varchar类型是以字符为单位,当字符集为GB18030时占用的字节数等于定义长度*2;当字符集为UTF-8时占用的字节数等于定义长度*4。

达梦技术社区: https://eco.dameng.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值