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)
  • 迁移时要根据实际字符集和业务需求调整字段定义,避免超长报错。
使用Rclone备份数据到云存储openWrt挂载opt扩容docker
Loading...