首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 中文亂碼徹底解決:字元集變數檢查、資料庫/連線/結果三層設定、PHP/JDBC/客戶端工具差異

     編輯:MySQL 資料庫相關知識

MySQL 中文亂碼核心在於「客戶端、連線層、伺服器端、儲存層」四層編碼一致。本文提供系統排查步驟、永久配置與各語言驅動最佳實務。

快速診斷:檢查字元集變數

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1  ← 常見問題點        |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

三層修正指令 (立即生效、僅限當前連線)

-- 1. 修正資料庫預設編碼 (永久)
ALTER DATABASE db_name CHARACTER SET utf8;

-- 2. 設定客戶端送出編碼 (當前連線)
SET character_set_client = gbk;   -- 或 utf8

-- 3. 設定結果集回傳編碼 (當前連線)
SET character_set_results = gbk;  -- 或 utf8

永久配置 (my.cnf / my.ini)

[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET NAMES utf8'   # 非 super 用戶自動執行

[mysql]
default-character-set = utf8

各環境最佳實務

環境解決方案
PHP (mysqli/PDO)連線後立即執行 SET NAMES utf8 / $mysqli->set_charset('utf8') / PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
Java JDBC連線字串加參數 ?characterEncoding=utf8&useSSL=false,驅動自動處理
Python MySQLdb/PyMySQLcharset='utf8' 參數或 cursor.execute('SET NAMES utf8')
Go database/sqlDSN 加 charset=utf8mb4,utf8
MySQL Workbench / Navicat / DBeaver連線屬性 → 編碼選 UTF-8,工具自動發送 SET NAMES
CMD / 黑視窗chcp 65001 + SET NAMES utf8mb4 (支援 Emoji)

常見誤區

  • 只改 my.cnf 不重啟服務 → 不生效。
  • 資料庫建立時未指定 CHARSET,預設 latin1,後續 ALTER DATABASE 僅影響新表,舊表需逐表 ALTER TABLE ... CONVERT TO CHARACTER SET utf8。
  • 使用 utf8 (MySQL 3 字節偽 UTF-8) 而非 utf8mb4 (真正 UTF-8),導致 Emoji/生僻字存入變 ??。建議全面遷移至 utf8mb4。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved