一、项目场景
公司新项目政企单位平台开发,由于甲方要求信创,导致不得不做数据库的切换。我们选用的的达梦数据库(DM8
),一家国产十几年的上市企业所打造的数据库。
二、问题描述
迁移达梦之后在同步mysql
数据到达梦时候,出现varchar
字段超长的情况,检查了mysql
设置的varchar
长度发现和同步过来的一致的,数据在mysql
可以入库 在dm8就不能存入
三、原因分析
达梦数据库在初始化数据库时候有两个参数UNICODE_FLAG
和LENGTH_IN_CHAR
跟字符集相关。根据不同的字符集varchar
所占长度是有所差异的。
UNICODE_FALG
:此参数表示了数据库中所有数据的字符集,包括数据字典的字符集。
需要注意的是,数据库一旦初始化完成,字符集就将无法修改。
我们可以使用selectunicode
来查询当前数据库的字符集种类,0代表gb18030
,1代表UTF8
。LENGTH_IN_CHAR
:此参数决定了,数据库中的varchar
类型对象的长度是否以字符为单位。
取值为1
则设置为以字符为单位,将存储长度值按照理论字符长度进行放大。 取值为0
则所有varchar
类型对象的长度以字节为单位。
四、解决方案
varchar
:varchar
存放可变长度的字符串,最大长度是2000
,对于空串,varchar
仍按空串处理。
varchar2
:也是存放可变长度的字符串,最大长度是4000
。VARCHAR2
把空串等同于null
处理。
- 如果你是
UTF-8
字符集,那么在设计表示后varchar
类型的字段长度可参考*4 - 如果你是
GBK
字符集,那么在设计表示后varchar
类型的字段长度可参考*2
参考自己的编码类型去具体的设置字段长度
-- 1.查看字符集
select unicode from dual;
-- 2.查看初始化参数 LENGTH_IN_CHAR
select * from SYS.V$PARAMPTER where name like '%LENGTH_IN_CHAR%';