温馨提示×

ubuntu mysql为何乱码了

小樊
37
2026-10-07 00:33:55
栏目: 云计算

在 Ubuntu 上 MySQL 出现乱码,通常不是“系统坏了”,而是字符集不一致导致的。下面按“最常见 → 少见”的原因给你说明,并给出解决办法。


一、最常见原因(90% 都是它)

1️⃣ MySQL 字符集不是 UTF-8

默认可能是 latin1,中文就会乱码。

查看当前字符集:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

如果看到:

character_set_server = latin1

那就是问题根源。

解决方法(推荐 UTF-8MB4):

编辑 MySQL 配置文件:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

在 [mysqld] 下添加:

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

再编辑客户端配置:

sudo nano /etc/mysql/conf.d/mysql.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

重启 MySQL:

sudo systemctl restart mysql

2️⃣ 数据库 / 表 / 字段字符集不一致

即使 MySQL 是 UTF-8,表和字段也可能不是。

查看表字符集:

SHOW CREATE TABLE your_table;

如果显示 latin1,执行:

ALTER DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ALTER TABLE your_table CONVERT TO CHARACTER SET utfmb4 COLLATE utf8mb4_unicode_ci;

3️⃣ 连接 MySQL 时没指定字符集(非常常见)

比如 PHP / Python / Java / Shell 连接时没设置 UTF-8。

命令行测试:

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

常见语言设置示例:

  • PHP (PDO)
new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass);
  • Python
conn = pymysql.connect(charset="utf8mb4")

二、Ubuntu 系统本身字符集问题(较少)

查看系统语言:

locale

如果不是 UTF-8:

sudo apt install locales
sudo dpkg-reconfigure locales

选择 en_US.UTF-8 或 zh_CN.UTF-8


三、导入 SQL 文件乱码

如果是导入 SQL 乱码:

mysql -u root -p --default-character-set=utf8mb4 db < file.sql

确保 SQL 文件本身是 UTF-8:

file file.sql

四、快速自查清单 ✅

  • [ ] MySQL server 是 utf8mb4
  • [ ] database / table / column 是 utf8mb4
  • [ ] 连接时指定 utf8mb4
  • [ ] 系统 locale 是 UTF-8
  • [ ] SQL 文件是 UTF-8

如果你愿意,可以把下面信息发我,我能直接帮你定位:

  1. SHOW VARIABLES LIKE 'character_set%';
  2. SHOW CREATE TABLE 表名;
  3. 你用的语言(PHP / Python / Java / Shell)

我可以直接告诉你改哪一行。

0 踩