type
Post
status
Published
date
Jul 23, 2025
slug
summary
迁移达梦数据库字符串长度问题
tags
开发
数据库
category
知行合一
icon
password
在将 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 表示字节数,不是字符数。
- 能存多少汉字,取决于数据库字符集。
查看字符集
- 返回 0:数据库使用 GB18030 字符集
- 返回 1:数据库使用 UTF-8 字符集
不同字符集下的存储能力
- GB18030:通常 1 个汉字占 2 字节,
varchar(200)最多存 100 个汉字。
- UTF-8:通常 1 个汉字占 3 字节,
varchar(200)最多存 66 个汉字(200/3 ≈ 66)。
解决方案
如果需要在达梦中存储指定数量的中文字符,建议使用字符长度语义:
- 这样可以确保字段能存储 200 个字符(无论是中文还是英文)。
总结
- MySQL 的
varchar(n)以字符为单位,达梦的varchar(n)以字节为单位。
- 达梦中如需存储 n 个字符,需用
varchar(n char)或varchar2(n char)。
- 迁移时要根据实际字符集和业务需求调整字段定义,避免超长报错。
- 作者:新月传说
- 链接:https://blog.950924.xyz/article/343b2e2d-14ef-80bc-850e-c4b18dbd5c92
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。







