在 Windows 上把 SQL 传进 MySQL 容器,导完发现所有中文都成了问号,而且导入过程没有任何报错。

原因

mysql 客户端在连接时按默认字符集解释你发过去的数据。如果客户端连接是 latin1,而库里是 utf8mb4,中文会在写进数据库之前就被转成问号,数据库层面已经损坏,没法恢复。

怎么确认

SHOW VARIABLES LIKE 'character_set_client';

如果结果显示 latin1、gbk 之类,就是这个问题。

正确做法

不要用 shell 管道传 SQL。 两种可靠的写法:

docker compose cp x.sql mysql:/tmp/x.sql
docker compose exec -T mysql sh -c "mysql -uroot -p*** --default-character-set=utf8mb4 typecho < /tmp/x.sql"

或者进去之后 SET NAMES utf8mb4; 再 source 文件。

教训

导入后一定要抽几个字段看一下中文,别只看「导入成功」。