MySQL 中文亂碼本質是編碼不一致,必須確保以下三者編碼一致:
CHARSET)character_set_client/connection/results)my.cnf 設定檔# 常見位置
/etc/my.cnf
/etc/mysql/my.cnf
/usr/etc/my.cnf
~/.my.cnf
# 若找不到,使用 find
find / -name "*.cnf" 2>/dev/null
cp /etc/my.cnf /etc/my.cnf.bak
vim /etc/my.cnf
[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
重點:請使用 utf8mb4 而非舊版 utf8,前者完整支援 Unicode(含 Emoji),後者僅支援 BMP 平面。
systemctl restart mysqld
# 或
service mysql restart
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set%';"
預期結果:除 character_set_filesystem、character_set_system 外,皆為 utf8mb4。
my.ini通常位於 MySQL 安裝目錄(如 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini)或 C:\Windows\my.ini。在 [mysqld]、[client]、[mysql] 區段加入相同的 utf8mb4 設定,重啟 MySQL 服務(net stop mysql && net start mysql)。
設定檔只影響伺服器端預設值,客戶端連線時仍需明確宣告:
| 語言/框架 | 設定方式 |
|---|---|
| PHP (PDO) | new PDO("mysql:host=...;charset=utf8mb4", $user, $pass) |
| PHP (mysqli) | $mysqli->set_charset("utf8mb4") |
| Python (PyMySQL) | charset="utf8mb4" 參數 |
| Java (JDBC) | URL 加 ?characterEncoding=utf8mb4 或 useUnicode=true&characterEncoding=utf8mb4 |
| C# (MySqlConnector) | 連線字串 Charset=utf8mb4 |
chcp 65001 將主控台切換為 UTF-8 代碼頁,但無法解決 MySQL 亂碼,原因:
cp936 (GBK) 連線,除非加 --default-character-set=utf8mb4正確做法:
chcp 65001
mysql -u root -p --default-character-set=utf8mb4
-- 檢查資料庫預設編碼
SHOW CREATE DATABASE db_name;
-- 檢查資料表編碼
SHOW CREATE TABLE tbl_name;
-- 修改資料庫預設編碼(僅影響新建表)
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 修改現有資料表編碼(會重建表,大表慎用)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改單一欄位編碼
ALTER TABLE tbl_name MODIFY col_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
latin1 實際存中文(雙重編碼):UPDATE tbl SET col = CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8mb4);character_set_server = utf8mb4SET NAMES utf8mb4 / charset=utf8mb4CHARSET = utf8mb4Content-Type: text/html; charset=utf-8<meta charset="utf-8">依循上述步驟,MySQL 中文亂碼問題將徹底解決。核心原則:全鏈路 utf8mb4,任何一環缺失都會亂碼。