温馨提示×

Debian如何解决MySQL乱码

小樊
60
2026-07-02 06:43:22
栏目: 云计算

在 Debian 上解决 MySQL 乱码问题,通常是因为 字符集(Character Set)或排序规则(Collation)配置不一致 导致的。下面按最常见原因 → 解决方案 → 验证步骤给你一个完整的排查与解决方法。


一、先确认 MySQL 当前字符集

登录 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、中文)

1️⃣ 修改 MySQL 配置文件

编辑:

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

三、检查并修复已有数据库 / 表

1️⃣ 查看数据库字符集

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;

2️⃣ 转换表和字段(非常重要)

ALTER TABLE 表名
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

如果是大量表,可以用脚本批量生成 SQL。


四、连接客户端乱码(PHP / Python / Shell)

✅ MySQL 客户端

登录时指定字符集:

mysql -u root -p --default-character-set=utf8mb4

✅ PHP (PDO 示例)

$pdo = new PDO(
    "mysql:host=localhost;dbname=test;charset=utf8mb4",
    "user",
    "password"
);

✅ Python

import pymysql

conn = pymysql.connect(
    host='localhost',
    user='root',
    password='123456',
    database='test',
    charset='utf8mb4'
)

五、Debian 系统本身语言环境(补充)

查看系统 locale:

locale

如果不是 UTF-8:

sudo dpkg-reconfigure locales

选择:

zh_CN.UTF-8
en_US.UTF-8

重启系统或重新登录。


六、常见误区 ❌

问题 说明
使用 utf8 MySQL 的 utf8 不是真正的 UTF-8(最多 3 字节)
只改数据库,不改表 不起作用
客户端和服务器字符集不一致 一定乱码
Debian 终端是 GBK 显示异常

七、快速排错顺序 ✅

  1. SHOW VARIABLES LIKE 'character_set%';
  2. /etc/mysql/my.cnf 字符集
  3. 重启 MySQL
  4. 数据库 / 表字符集
  5. 客户端连接字符集
  6. Debian 系统 locale

如果你愿意,可以告诉我:

  • MySQL 版本(mysql -V
  • 命令行乱码 / Web 页面乱码 / 插入乱码?
  • 使用的是 MySQL 还是 MariaDB?

我可以给你 针对你环境的精准配置方案

0