【DM版本】:v8
【操作系统】:统信uos
【CPU】: aarch64
【问题描述】*:mysql迁移达梦后表数据显示异常
sql语句更新后 重新查询显示异常
mysql迁移到dm创建问题可以查看:
https://eco.dameng.com/document/dm/zh-cn/faq/faq-mysql-dm8-migrate.html
这个是源端和目的端字符集不一样,dm端又开了mysql的兼容模式,到达梦端后长度不够被截断了
处理方法:1、可以增加达梦的字段长度 2、调整目的端的字符集
1、当输入内容不超过字段长度时,数据显示正常;
2、当超出字段长度时,会截断存储并在以特殊字符结尾显示,在应用日志或数据库日志里不显示报错信息;
3、如果能确定该字段的长度,可以通过调整字段长度的方式,来规避,或者改成大字段存储;
4、还可以查看dm.ini兼容参数compatible_mode=4(4是兼容mysql),如果是兼容mysql,则修改为compatible_mode=0,那么当存储数据超出字段长度时,应用日志和数据库日志均会正常报错‘超出字段长度’,再根据报错调整字段类型或长度即可
达梦数据库默认是以字节为单位,mysql迁移过来建议数据库为字符为单位
排查:
(1) mysql字符集 和达梦的字符集是否一致.
达梦查看字符集:
select * from SYS.“V$OPTION” a where a.PARA_NAME = ‘GLOBAL_CHARSET’ ;
– GLOBAL_CHARSET: 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
– GLOBAL_CHARSET: 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
(2) 调整 dm 数据库中 defaultvalue 字段长度.
MySQL 中 varchar(1) 可以存一个汉字,DM 数据库是以字节为单位。gb18030 字符集,varchar(2) 才可以存一个汉字;UTF-8 字符集,varchar(3) 才可以存一个汉字。此种情况下,为了保证汉字可以完整的被存储,扩大字段是合理的。
(3) 重新迁移相应数据.