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

MySQL 中文亂碼徹底解決:從庫、表、連線、頁面四層統一 UTF-8 最佳實踐

     編輯:MySQL 資料庫相關知識

亂碼根因:編碼鏈路任一環節不一致


數據存儲 (表 CHARSET) → 連線傳輸 (SET NAMES) → 頁面輸出 (HTTP Header/Meta) → 瀏覽器渲染
      ↑                      ↑                      ↑                      ↑
   utf8mb4                utf8mb4                utf-8                  utf-8

任一環節為 latin1/gbk 即產生亂碼 (、???、鍵盤字符)。

四步徹底治理 (一勞永逸)

1. 庫級:創建時指定 utf8mb4


CREATE DATABASE my_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 表級:建表顯式聲明 (不依賴庫默認)


CREATE TABLE articles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    content TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. 連線級:應用啟動即執行 SET NAMES


-- PHP (mysqli/PDO)
$mysqli->set_charset('utf8mb4');
$pdo->exec("SET NAMES utf8mb4");

-- Java (JDBC URL)
jdbc:mysql://host:3306/db?characterEncoding=utf8&useUnicode=true&connectionCollation=utf8mb4_unicode_ci

-- Python (PyMySQL)
conn = pymysql.connect(charset='utf8mb4')

-- Go (go-sql-driver/mysql)
dsn := "user:pass@tcp(host:3306)/db?charset=utf8mb4&parseTime=True&loc=Local"

4. 輸出級:HTTP 響應頭強制 UTF-8


-- PHP (輸出任何內容前)
header('Content-Type: text/html; charset=utf-8');

-- Nginx (全站生效)
add_header Content-Type "text/html; charset=utf-8";
# 或
charset utf-8;

-- HTML Meta (兜底)

遷移存量庫表:pt-online-schema-change 零停機轉碼


pt-online-schema-change \
  --alter "CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" \
  D=my_db,t=big_table \
  --execute --max-load Threads_running=50 --critical-load Threads_running=100

常見坑位避雷

現象原因修正
Emoji 存成 ????表/列為 utf8 (僅 3 字節)改 utf8mb4 (4 字節)
中文變 連線未 SET NAMES,驅動默認 latin1連線建立即執行 SET NAMES utf8mb4
頁面顯示 鍵盤字符HTTP Header 無 charset,瀏覽器猜測錯誤header('Content-Type: ... charset=utf-8')
JDBC 存取正常但查詢亂碼connectionCollation 未指定JDBC URL 加 connectionCollation=utf8mb4_unicode_ci

總結

**「庫表 utf8mb4、連線 SET NAMES、輸出 Header utf-8」** 三句口訣貫穿全鏈路。新專案開局即鎖定,舊專案用 pt-osc 遷移,徹底告別中文亂碼,同時擁抱 Emoji 與多語言國際化。

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