在将 MySQL 数据库迁移到达梦数据库时,遇到一个常见问题:字符串字段在存储中文时,达梦数据库报超出长度。
问题描述
- MySQL 版本:8.4.1
-
现象:在 MySQL 中,
varchar(255)
能存储 255 个汉字;但迁移到达梦后,插入相同长度的中文字符串会报超长错误。
原因分析
1. MySQL 的 varchar 长度
- MySQL 5.0 及以上,
varchar
最大长度为 65535 字节。 - 但实际可用长度略小(需预留 1~2 字节存储长度信息),即最大 65533 字节。
-
varchar(200)
中的 200 表示字符数,但实际能存多少字符还要看字符集。- 例如:
utf8mb4
下,一个 Unicode 字符最多占 4 字节,所以varchar(65533/4)
最多存 16383 个字符。
- 例如:
2. 达梦数据库的 varchar 长度
- 达梦中,
varchar(200)
的 200 表示字节数,不是字符数。 - 能存多少汉字,取决于数据库字符集。
查看字符集
SELECT SF_GET_UNICODE_FLAG();
- 返回 0:数据库使用 GB18030 字符集
- 返回 1:数据库使用 UTF-8 字符集
不同字符集下的存储能力
-
GB18030:通常 1 个汉字占 2 字节,
varchar(200)
最多存 100 个汉字。 -
UTF-8:通常 1 个汉字占 3 字节,
varchar(200)
最多存 66 个汉字(200/3 ≈ 66)。
解决方案
如果需要在达梦中存储指定数量的中文字符,建议使用字符长度语义:
VARCHAR(200 CHAR)
- 这样可以确保字段能存储 200 个字符(无论是中文还是英文)。
总结
- MySQL 的
varchar(n)
以字符为单位,达梦的varchar(n)
以字节为单位。 - 达梦中如需存储 n 个字符,需用
varchar(n char)
或varchar2(n char)
。 - 迁移时要根据实际字符集和业务需求调整字段定义,避免超长报错。