MySQL 迁移达梦数据库字符串问题

在将 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)
  • 迁移时要根据实际字符集和业务需求调整字段定义,避免超长报错。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容