首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Ubuntu MySQL 中文亂碼徹底解決方案:配置 utf8mb4

     編輯:MySQL 綜合教學

問題現象


mysql> INSERT INTO users(name) VALUES('張三');
mysql> SELECT * FROM users;
+----+--------+
| id | name   |
+----+--------+
|  1 | ??     |
+----+--------+

根因

MySQL 預設字元集 latin1 (單字節),無法儲存多字節中文字符。需統一設為 utf8mb4 (支援完整 Unicode,含 Emoji)。

解決步驟 (Ubuntu 16.04/18.04/20.04/22.04)

1. 修改配置檔


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

在 [mysqld] 區段新增/修改:


[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

2. 重啟 MySQL 服務


sudo systemctl restart mysql

3. 驗證配置生效


mysql -u root -p -e "SHOW VARIABLES LIKE '%character%';"
# 或登入後執行
SHOW VARIABLES LIKE '%character%';

預期輸出關鍵項均為 utf8mb4。

4. 重建資料庫/表驗證中文正常


CREATE DATABASE test_utf8mb4 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE test_utf8mb4;
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO t VALUES (1, '中文測試😀');
SELECT * FROM t;
-- 正常顯示:中文測試😀

注意事項

  1. 修改字元集不會自動轉換現有資料。 現有表需執行:ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. 應用層連線字串 亦需指定字元集:JDBC ?characterEncoding=utf8mb4、Python charset='utf8mb4'、PHP PDO charset=utf8mb4。
  3. MySQL 8.0+ 已預設 utf8mb4,通常無需手動修改,僅需確認。

常見誤區

  • 使用 utf8 (MySQL 別名 utf8mb3) → 僅支援 BMP 平面,無法儲存 Emoji、部分生僻字。
  • 只改 character-set-server 不改 client 區段 → 客戶端插入仍按 latin1 發送,入庫亂碼。
  • 以為 SET NAMES utf8mb4 永久生效 → 僅當前 Session 有效,需寫入配置檔或連線初始化 SQL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved