在 Debian 上解决 MySQL 乱码(中文乱码) 问题,核心是要保证 客户端、连接、服务器、数据库、表、字段 的字符集一致,通常推荐使用 utf8mb4。
下面按「快速排查 → 修改配置 → 验证」来说明。
登录 MySQL:
mysql -u root -p
执行:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
重点看这几个:
character_set_clientcharacter_set_connectioncharacter_set_databasecharacter_set_server如果看到 latin1,就很可能乱码。
Debian 上通常是:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 下添加:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
在同一文件或 /etc/mysql/conf.d/ 下新建:
sudo nano /etc/mysql/conf.d/client.cnf
内容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
sudo systemctl restart mysql
ALTER DATABASE 数据库名
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
在程序中连接 MySQL 时:
SET NAMES utf8mb4;
new PDO(
"mysql:host=localhost;dbname=test;charset=utf8mb4",
$user, $pass
);
conn = pymysql.connect(
host='localhost',
user='root',
password='',
database='test',
charset='utf8mb4'
)
❌ utf8 ≠ utf8mb4
utf8 只支持 3 字节(存不了 emoji)❌ 导入 SQL 文件乱码
导入时指定:
mysql -u root -p 数据库名 < file.sql --default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
如果你愿意,可以告诉我:
我可以给你更精确的方案。