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

MySQL 字元集完整解析:六大關鍵層級與統一為 UTF-8 最佳實踐

     編輯:MySQL 資料庫相關知識

MySQL 字元集設定涉及六大關鍵層級,任何一環不一致即可能導致亂碼。本文系統解析各層級職責、查看現狀指令、安裝時預設 UTF-8 步驟、事後修正方案與驗證方法。

一、六大字元集層級職責

層級變數名職責說明
Clientcharacter_set_client客戶端發送 SQL 的編碼(對應網頁 <meta charset="utf-8">)
Connectioncharacter_set_connection連接層轉換目標編碼,PHP 未指定時依伺服器預設
Databasecharacter_set_database資料庫預設編碼,建庫未指定時繼承 Server
Resultscharacter_set_results伺服器回傳結果集編碼,未指定時依 Server
Servercharacter_set_server伺服器安裝時指定的預設編碼(最高層級)
Systemcharacter_set_system系統內部識別碼編碼,通常固定 UTF-8

二、層級繼承關係

System (utf8) → Server → Database → Table → Column
                              ↘ Connection → Client / Results
  • System 通常固定 utf8,為根基
  • Server 為最高可配置層級,下游未明確指定時層層繼承
  • 表、欄位同理依上層繼承

三、查看當前字元集狀態

-- 方式 1:STATUS 指令
STATUS;

-- 方式 2:SHOW VARIABLES 精確查詢
SHOW VARIABLES LIKE 'character_set_%';

四、最佳實踐:安裝時直接指定 UTF-8

最徹底解決亂碼的方法是在 MySQL 安裝/初始化時即設定 character_set_server=utf8、collation_server=utf8_general_ci,使六大層級全為 UTF-8,免除後續修正麻煩。

五、事後修正:建庫/建表/連接指定 UTF-8

1. 建庫指定

CREATE DATABASE qss
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;

2. 建表指定

CREATE TABLE t (c VARCHAR(20)) CHARSET=utf8;

3. 修改既有資料庫/表/欄位字元集

ALTER DATABASE qss CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE t MODIFY c VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci;

4. 連接層指定(PHP PDO 範例)

$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$pdo = new PDO($dsn, $user, $pass);

5. 連接執行 SET NAMES

SET NAMES utf8;  -- 等同於設定 client/connection/results 三者為 utf8

六、驗證與避坑指南

  • 資料已寫入時修改字元集需用 CONVERT TO 實際轉碼,單純 CHARACTER SET 僅改中繼資料
  • utf8mb4(MySQL 5.5.3+)支援完整 Unicode(含 Emoji),新專案建議直接採用
  • 排序規則 utf8_general_ci 效能較好,utf8_unicode_ci 排序更精準(如德語 ß=ss),視需求選擇
  • 檢查 SHOW CREATE TABLE 確認欄位實際字元集

字元集設定示意圖

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