数据库导入和导出最怕的不是文件大,是字符集在背后给你埋雷。文件传上去了,命令也跑起来了,屏幕上蹦出一串报错,回头一看表里多了问号、方块,或者整段中文变成乱码。这种事修起来不难,难的是很多人一上来就改连接串,改完发现还是原来的毛病。

数据库导入和导出,三个报错通常绕不开字符集
先把三个常见面孔摆出来:ERROR 1366、ERROR 1267、ERROR 1273。名字不一样,脾气也不一样。1366多半是值塞不进字段,1267是比较规则在打架,1273更直接,目标库根本不认识这个排序规则。别看到报错就慌,先分清是哪一类,后头就好办。
1366:库能连上,字段却不肯收
ERROR 1366 (HY000): Incorrect string value 这句出来,很多人第一反应是连接编码错了。连接当然要看,但更该看列。表的字符集是 utf8mb3,字段偏要存四字节的 emoji,或者列还是 latin1,程序却按 utf8mb4 往里灌中文,都会撞上它。用 SHOW FULL COLUMNS FROM 表名; 扫一眼 Collation 那一列,比盯着错误码猜半天管用。
还有个细节容易漏:库默认 utf8mb4,不代表表也是;表是 utf8mb4,不代表每个列都是。有人建表时从旧项目复制结构,列上带着 latin1 一路跟过来,导数据时才现原形。要改就库、表、列一起看,别只改一半。
1267:排序规则打架,查询先翻脸
1267 的原文里常带 Illegal mix of collations,意思不是数据坏了,是两边的比较规则对不上。比如一张表是 utf8mb4_general_ci,另一张是 utf8mb4_0900_ai_ci,做 JOIN 或者 WHERE 比较时就可能翻脸。MySQL 8 默认排序规则换过,老库老表迁过去,这毛病并不少见。
临时救急可以在查询里显式写 COLLATE,把两边拉到同一个规则上;长期还是得统一库表列的排序规则。有人图省事只改连接参数,结果查询该报还是报。连接字符集管的是传输,排序规则管的是比较,两码事,别混着治。
1273:版本不认的排序规则
ERROR 1273 (HY000): Unknown collation 多半出现在导 dump 的时候。源库是 MySQL 8,导出文件里带着 utf8mb4_0900_ai_ci,目标库是 5.7 或者更老的版本,它压根不认识这个排序规则,建表那一步就卡住。这时候光加 –default-character-set=utf8mb4 不解决全部问题,文件里的 COLLATE 子句还在。
靠谱的做法是确认目标库支持哪种排序规则,再把 dump 里的排序规则替换成目标库认的,比如 utf8mb4_general_ci 或 utf8mb4_unicode_ci,具体以目标库的 SHOW COLLATION 结果为准。替换前先备份,别在原文件上直接动手。生产库上玩全局替换,手一抖就是另一场事故。
库、表、列三级,别只看连接串
排查顺序我一般这么走:先 SHOW VARIABLES LIKE ‘character_set_%’; 看服务端和连接,再 SHOW CREATE DATABASE 看库,SHOW CREATE TABLE 看表,最后 SHOW FULL COLUMNS 看列。三级都齐了,再谈导入导出。只盯着连接串,等于只看了大门,屋里哪个房间锁着根本没查。
顺带说一句,字符集和排序规则不是一回事。字符集决定能存哪些字,排序规则决定怎么比、怎么排。utf8mb4 能存四字节字符,utf8mb3 存不了 emoji,这个差异在导入用户昵称、评论内容时特别容易冒出来。别等数据进了库再来补,补起来费劲。
导出时加参数,比事后补锅省事
导出我用 mysqldump 时会把字符集写明:mysqldump –default-character-set=utf8mb4 -u 用户名 -p 库名 > 库名.sql。导完别急着传,打开文件头看看有没有 SET NAMES utf8mb4 之类的语句,确认导出端和文件本身没跑偏。Windows 上用记事本另存为 ANSI 这种事,真不是段子,文件编码一改,后头全乱。
导入也一样,客户端连接、导入命令、目标库三者的字符集尽量对齐。大文件别一上来就往生产库灌,先建个同字符集的临时库,拿一张小表试水,看看中文、emoji、生僻字是不是都能正常落库。试完再动正式库,心里有底。
真乱码了,别急着全局替换
已经存进去的乱码,和显示出来的乱码,是两回事。显示乱码可能只是客户端连接字符集不对,改连接就能好;存进去坏了,那是数据本身被转错了,得从源头重新导。最怕的是有人看到乱码就跑去做全局字符替换,把本来正常的英文和符号也一起改掉,最后收拾起来更麻烦。
还有种情况是导了一半失败,表里留了一堆半截数据。这时候先停,别继续灌。把失败的那张表单独拎出来,看结构、看编码、看导入日志,再决定是修表还是重导。数据库导入和导出这事,慢一点比返工强。
记住一个笨办法:动手前备份,动手时看三级编码,动完拿中文和 emoji 各试一条。三个报错里,1366看列,1267看排序规则,1273看目标库版本,基本就能对上号。剩下的,以服务商或官方文档的说明为准,别拿生产库当试验田。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!