萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

徹底解決 MySQL 中文亂碼:Linux/Windows 設定檔、連線編碼、CMD 代碼頁完整指南

亂碼產生的三大關鍵點

MySQL 中文亂碼本質是編碼不一致,必須確保以下三者編碼一致:

  1. 資料庫/資料表/欄位的儲存編碼(CHARSET)
  2. 連線/客戶端的傳輸編碼(character_set_client/connection/results)
  3. 應用程式/終端機的顯示編碼

Linux 環境:修改 my.cnf 設定檔

1. 尋找設定檔位置

# 常見位置
/etc/my.cnf
/etc/mysql/my.cnf
/usr/etc/my.cnf
~/.my.cnf

# 若找不到,使用 find
find / -name "*.cnf" 2>/dev/null

2. 備份並編輯

cp /etc/my.cnf /etc/my.cnf.bak
vim /etc/my.cnf

3. 關鍵設定(MySQL 5.7+/8.0 建議)

[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 平面。

4. 重啟服務驗證

systemctl restart mysqld
# 或
service mysql restart

mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set%';"

預期結果:除 character_set_filesystem、character_set_system 外,皆為 utf8mb4。

Windows 環境:修改 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

Windows CMD 代碼頁陷阱

chcp 65001 將主控台切換為 UTF-8 代碼頁,但無法解決 MySQL 亂碼,原因:

  • CMD 字型(預設 Raster Fonts)不支援中文顯示,需改用 Consolas 或 NSimSun
  • MySQL Client 預設仍用 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;

歷史資料已亂碼怎麼辦?

  1. 若原資料為 latin1 實際存中文(雙重編碼):
    UPDATE tbl SET col = CONVERT(CAST(CONVERT(col USING latin1) AS BINARY) USING utf8mb4);
  2. 若無法修復,唯有從備份還原並重新正確匯入

快速檢查清單

  • [ ] 伺服器 character_set_server = utf8mb4
  • [ ] 客戶端連線指定 SET NAMES utf8mb4 / charset=utf8mb4
  • [ ] 資料庫/資料表/欄位 CHARSET = utf8mb4
  • [ ] 應用程式輸出 HTTP Header Content-Type: text/html; charset=utf-8
  • [ ] 前端 HTML <meta charset="utf-8">

依循上述步驟,MySQL 中文亂碼問題將徹底解決。核心原則:全鏈路 utf8mb4,任何一環缺失都會亂碼。

copyright © 萬盛學電腦網 all rights reserved