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

徹底解決 MySQL 中文 UTF-8 亂碼:從配置到代碼的完整鏈路指南

     編輯:MySQL 資料庫相關知識

UTF-8 亂碼是 MySQL 開發者的「成人禮」。本文從字符集傳輸鏈路原理出發,給出配置文件、建表語句、連接代碼三層徹底修復方案,並解釋為什麼 cmd.exe 終端顯示亂碼屬正常現象。

一、 亂碼根因:字符集不一致的傳輸鏈路

一次完整的寫入/讀取涉及 4 個關鍵節點:

  1. Client(應用/驅動發送編碼)
  2. Connection(服務端解碼編碼)
  3. Database/Table/Column(存儲編碼)
  4. Results(服務端回傳編碼)

任意節點非 UTF-8,即產生「雙重編碼」或「解碼錯誤」→ 亂碼。

二、 診斷命令

SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation_%';

重點關注 character_set_client、connection、results 是否為 utf8(或 utf8mb4)。

三、 三層修復方案

1. 配置文件

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

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

建議: 使用 utf8mb4 而非 utf8,完整支持 Emoji 與生僻字。修改後 必須重啟 mysqld。

2. 建表/建庫顯式指定

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE t (c VARCHAR(255)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

列級 COLLATE 可省略,繼承表級預設。

3. 應用層代碼

PHP (mysqli/PDO):

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

// PDO
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'user', 'pass');

舊版 mysql_* 函數(已棄用):

mysql_query("SET NAMES utf8mb4");

Web 頁面:

<meta charset="utf-8">
header('Content-Type: text/html; charset=utf-8');

四、 特殊場景:Windows cmd.exe

中文 Windows 預設代碼頁 CP936 (GBK),無法顯示完整 UTF-8。在 cmd 執行 mysql 客戶端看到亂碼屬正常,不代表數據錯誤。解決:

  • 使用支持 UTF-8 的終端(Windows Terminal、PowerShell 7+、Git Bash)。
  • 或臨時 chcp 65001 並設置字體為 TrueType(Consolas)。
  • 生產環境驗證請用圖形工具或 Web 頁面。

五、 驗證清單

  1. 配置文件三段均設 utf8mb4 → 重啟。
  2. SHOW VARIABLES 確認 client/connection/results 均為 utf8mb4。
  3. 建表指定 CHARSET=utf8mb4。
  4. 應用連接後首條執行 SET NAMES utf8mb4(或驅動原生 charset 參數)。
  5. 頁面 Meta/Header 聲明 UTF-8。
  6. 插入含 Emoji 測試:INSERT ... VALUES ('測試😀'),多端查看一致。

六、 總結

亂碼本質是「編碼協議不一致」。統一 配置層 → 存儲層 → 連接層 → 展示層 四層為 utf8mb4,即可一勞永逸。拒絕「碰運氣式」修復,建立標準化初始化腳本,新實例一鍵合規。

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