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

MySQL 中文亂碼終極解決方案:server/client/connection 三層編碼一致性實戰

     編輯:MySQL 資料庫相關知識

亂碼本質:編碼不一致的三個層面

層面變數作用常見值
Servercharacter_set_server建庫建表預設編碼latin1 / utf8 / utf8mb4
Database/Table/ColumnCHARSET實際儲存編碼utf8 / gbk / utf8mb4
Connectioncharacter_set_client/connection/results客戶端↔Server 通訊編碼utf8 / gbk / latin1

鐵律:Client = Connection = Results = Table Column,四者完全一致,零亂碼。

標準化流程:統一 utf8mb4

1. 修改 Server 預設 (永久生效)

# /etc/my.cnf / /etc/mysql/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
systemctl restart mysqld

2. 修正既有庫表編碼

-- 庫
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 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

3. 連線層強制指定 (程式碼/連接池)

  • JDBC:jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false
  • PHP PDO:new PDO("mysql:host=...;dbname=...;charset=utf8mb4", ...)
  • Python:charset='utf8mb4' 參數
  • 命令列臨時:mysql --default-character-set=utf8mb4

4. 驗證一致性

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
-- 期望全部為 utf8mb4 / utf8mb4_unicode_ci

遷移舊專案:GBK/Big5 → utf8mb4 實戰步驟

  1. 備份:mysqldump --default-character-set=gbk db > backup.sql
  2. 建新庫 utf8mb4
  3. 導入:mysql --default-character-set=utf8mb4 db < backup.sql
  4. 應用層連線字串同步修改
  5. 全鏈路測試:寫入 → 讀取 → 搜尋 → 匯出

常見陷阱與排查

現象原因解決
命令列正常、Web 亂碼應用連線未指定 charset修正連接池/DSN 參數
Emoji 存成 ????表/欄位仍為 utf8 (3 字節)CONVERT TO utf8mb4
匯出 CSV 亂碼Excel 預設 ANSI/GBK匯出 UTF-8 BOM 或用工具轉碼
排序錯誤Collation 不同統一 utf8mb4_unicode_ci

結語

MySQL 中文亂碼 99% 來自三層編碼不一致。Server/Table/Connection 全鏈路 utf8mb4 + 統一 Collation,一次配置、永久免疫。新專案開工第一件事:SET NAMES utf8mb4 寫入基線規範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved