在 Debian 上解决 MySQL 乱码问题,通常是因为 字符集(Character Set)或排序规则(Collation)配置不一致 导致的。下面按最常见原因 → 解决方案 → 验证步骤给你一个完整的排查与解决方法。
登录 MySQL:
mysql -u root -p
执行:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
正常情况应看到类似:
character_set_client = utf8mb4
character_set_connection= utf8mb4
character_set_database = utf8mb4
character_set_results = utf8mb4
character_set_server = utf8mb4
collation_connection = utf8mb4_unicode_ci
collation_database = utf8mb4_unicode_ci
collation_server = utf8mb4_unicode_ci
如果不是 utf8mb4,就很可能乱码。
utf8mb4(支持 emoji、中文)编辑:
sudo nano /etc/mysql/my.cnf
或(新版 Debian / MariaDB):
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
添加或修改以下内容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
保存后退出,重启 MySQL:
sudo systemctl restart mysql
或:
sudo systemctl restart mariadb
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = '数据库名';
如果不是 utf8mb4,转换数据库:
ALTER DATABASE 数据库名
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
如果是大量表,可以用脚本批量生成 SQL。
登录时指定字符集:
mysql -u root -p --default-character-set=utf8mb4
$pdo = new PDO(
"mysql:host=localhost;dbname=test;charset=utf8mb4",
"user",
"password"
);
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='test',
charset='utf8mb4'
)
查看系统 locale:
locale
如果不是 UTF-8:
sudo dpkg-reconfigure locales
选择:
zh_CN.UTF-8
en_US.UTF-8
重启系统或重新登录。
| 问题 | 说明 |
|---|---|
使用 utf8 |
MySQL 的 utf8 不是真正的 UTF-8(最多 3 字节) |
| 只改数据库,不改表 | 不起作用 |
| 客户端和服务器字符集不一致 | 一定乱码 |
| Debian 终端是 GBK | 显示异常 |
SHOW VARIABLES LIKE 'character_set%';/etc/mysql/my.cnf 字符集如果你愿意,可以告诉我:
mysql -V)我可以给你 针对你环境的精准配置方案。