问题其实很常见:库是 GBK 编码,要导入的 dmp 文件却是 UTF-8 的。一开始没注意,直接导,报错或者中文变问号。查了一下,是客户端字符集和文件不匹配。

GBK 双字节,最高位用来区分中英文,碰上非中文字符就直接歇菜。
UTF-8 变长,1 到 4 字节,英文 1 字节,汉字 3 字节。用 GBK 的客户端去解析 UTF-8 内容时,字节边界对不上,解析就乱套了。
提一下达梦的一个情况:实例本身是 GB18030 编码时,导 UTF-8 文件可能还能凑合过去;但实例如果是 UTF-8,有些操作反而失败。
MySQL 那边,把 UTF-8 文件直接灌到 GBK 库里,中文大概率乱码。
处理办法我这边试了几种,按顺手程度说。
第一种,直接改客户端编码配置。达梦的话,在 dm_svc.conf 里加上 CHAR_CODE=PG_UTF8,管理工具重启后,客户端就用 UTF-8 跟数据库通信了。这招最简单,不用动文件,前提是数据库本身允许这种交互。
很多时候线上环境这个配置不一定能动,权限或管控原因,只能看情况。
第二种,用命令行工具 dimp 导入,确保终端环境也是 UTF-8,省去中间转换。命令差不多这样:
dimp USERID=SYSDBA/SYSDBA@LOCALHOST:5236
FILE=/path/to/file.dmp
REMAP_SCHEMA=old:new
IGNORE=Y
COMPILE=Y
INDEXFIRST=N
TABLE_FIRST=Y
COMMIT_ROWS=5000
FAST_LOAD=N
终端和文件编码一致就不会引入新乱码。
第三种,文件编码直接转。用 iconv 把 UTF-8 的 dmp 转成 GBK:
iconv -f UTF-8 -t GBK input.dmp > output_gbk.dmp
转完再导入 GBK 库。
MySQL 这种不太方便动态调整编码的场景,这招比较常用。不过要注意,如果文件里有 GBK 里根本不存在的一些生僻字或特殊字符,iconv 可能会报错或丢掉,需要先查一下内容。
第四种,如果有条件,直接重建数据库,建实例的时候就指定 UTF-8 字符集。达梦里可以这样:
CREATE DATABASE utf8_db CHARACTER SET UTF8;
从源头把编码统一掉,后面再也不用转来转去。但这方案比较重,线上很难说建就建。
排查的时候,先确认数据库当前的字符集。达梦执行 select SF_GET_UNICODE_FLAG(); 返回值 0 是 GB18030,1 是 UTF-8,2 是 EUC-KR。
如果跟预期不一致,那初始化参数就得检查一下。
导入之前最好看看目标库里是不是已经有同名对象:
SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = '目标表名';
开放的API接口与回调机制,将来此加密的SSL证书申请能力无缝集成到自己的CI/CD流程或管理系统中。通过自定义API实现特定的验证与部署逻辑,构建专属的自动化安全基础设施。
不然冲突了又是一顿处理。
日志里经常看到两种错:"字符集不支持",多半是文件里有 GBK 不认识的字符;"字段截断",是因为同一个汉字在 UTF-8 占 3 字节,在 GBK 里只占 2 字节,字段长度没设计够,一导入就超长。
几点建议:多语言项目统一用 UTF-8,省心。
如果纯粹中文环境,GBK 存汉字确实省一点存储,但得确保不会出现生僻字。操作前先把原文件和数据库备了,达梦 8 的话留意下版本,确保支持目标编码。任何方案都先拿小数据量跑一遍,确认无误再上大批量,这点时间值得花。