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

MySQL 中文亂碼終極解決方案:從頁面到資料庫的全鏈路字符集統一

     編輯:MySQL 資料庫相關知識

核心原則:專案伊始統一字符集

頁面、Request、資料庫、連線、表、欄位 —— **全鏈路單一字符集**(UTF-8 或 GBK),亂碼根除 99%。

三大亂碼現象與快速定位

現象成因層級快速修復
頁面顯示亂碼HTTP 響應編碼<meta charset="UTF-8"> / header('Content-Type: text/html; charset=UTF-8')
參數傳遞亂碼Request 編碼request.setCharacterEncoding("UTF-8") (Java) / mysqli_set_charset($link, 'utf8') (PHP)
資料庫存儲亂碼資料庫/表/欄位/連線編碼本文重點解決

MySQL 字符集四層級繼承鏈

編譯預設 (latin1)
  → my.cnf [mysqld] default-character-set
    → 啟動參數 --character-set-server
      → CREATE DATABASE 預設字符集
        → USE DATABASE 時 character_set_database
          → CREATE TABLE 預設字符集
            → 定義欄位時預設字符集

場景 A:全新安裝,修改預設為 UTF-8

# 1. 編輯配置檔
vi /etc/my.cnf  (或 /etc/mysql/my.cnf)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

# 2. 重啟服務
systemctl restart mysqld

# 3. 驗證
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

預期輸出:character_set_client/connection/database/results/server = utf8mb4,character_set_system = utf8,collation_* = utf8mb4_unicode_ci。

場景 B:已有資料庫/表,遷移至 UTF-8

# 1. 修改配置檔(同場景 A)

# 2. 修改庫級預設
ALTER DATABASE dbname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

# 3. 修改表級預設 + 轉換現有欄位
ALTER TABLE tblname CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 注意:CONVERT TO 會實際重寫資料,大表請維護窗口操作

# 4. 僅修改表預設不轉換資料
ALTER TABLE tblname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

# 5. 重啟驗證

場景 C:運行時動態設定(不修改配置檔)

SET NAMES utf8mb4;  -- 等同於同時設定 client/connection/results
-- 或分別設定
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

PHP 連線最佳實踐

$mysqli = new mysqli('host', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4');  // 必須在查詢前調用

// PDO
$pdo = new PDO('mysql:host=host;dbname=db;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

為什麼推薦 utf8mb4 而非 utf8?

  • MySQL utf8 = utf8mb3,僅支援 BMP(基本多文種平面),**不支援 Emoji、生僻漢字**
  • utf8mb4 真正支援 Unicode 4 位元組字符,向下相容
  • 索引長度限制:utf8mb4 單欄索引 191 字元(InnoDB 767 位元組),5.7.7+ 可調 innodb_large_prefix=ON 放寬至 3072 位元組

遺留專案 GBK → UTF-8 遷移清單

  1. 備份資料庫(mysqldump --default-character-set=gbk)
  2. 修改配置檔、庫、表、欄位全鏈路改 UTF-8
  3. 應用程式碼:頁面編碼、資料庫連線字符集、URL 編碼/解碼
  4. 測試驗證:中文、英文、Emoji、特殊符號全覆蓋
  5. 灰度發布 → 全量切換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved