首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 字元集完整設定指南:亂碼根因分析、轉換流程與最佳實踐

     編輯:MySQL 綜合教學

核心概念

  • 字元:最小表義符號(如 'A'、'中')
  • 編碼:字元對應的數值
  • 字元集:字元與編碼的對應集合
  • 排序規則:同字元集內字元比較規則(如 utf8_general_ci 不分大小寫)

MySQL 字元集系統變數

字元集轉換流程

  1. 請求資料:client → connection
  2. 內部操作:connection → 欄位/表/庫/ server 字元集(優先級遞減)
  3. 結果輸出:內部字元集 → results

亂碼根因分析(實戰案例)

常見鏈路:欄位無設定 → 表無設定 → 庫無設定 → server 預設 latin1,而連線層為 UTF-8,導致中文寫入時經歷 UTF-8 → latin1 轉換,超出 latin1 範圍的字元變成 ?,資料永久損壞。

常見問題場景

FAQ-1:庫為 UTF-8,插入未設連線字元集,查詢時設 UTF-8

插入經歷 latin1 → latin1 → UTF-8,漢字從 3 字節變 6 字節;查詢 UTF-8 → UTF-8 原樣輸出 6 字節 → 亂碼。

FAQ-2:庫為 latin1,插入前設連線 UTF-8(本文遇到情況)

插入經歷 UTF-8 → UTF-8 → latin1,超出 latin1 範圍字元轉為 ?,資料永久遺失,無法恢復。

檢測工具

SHOW CHARACTER SET;
SHOW COLLATION;
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
SELECT HEX(col), LENGTH(col), CHAR_LENGTH(col) FROM tbl;
SELECT CHARSET(col), COLLATION(col) FROM tbl;

最佳實踐建議

  • 建庫/建表/操作時顯式指定字元集,不依賴預設值
  • 資料庫與連線字元集統一使用 UTF-8(而非 latin1)
  • C API 用 mysql_options(MYSQL_SET_CHARSET_NAME, "utf8")
  • PHP 短連線用 SET NAMES utf8,長連線重連後需重設

修改預設字元集方法

修改 my.ini

default-character-set = utf8
character_set_server = utf8

動態指令

SET NAMES 'utf8';  -- 等同於設定 client、connection、results 三者
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
變數含義
character_set_server預設內部操作字元集
character_set_client客戶端來源資料字元集
character_set_connection連接層字元集
character_set_results查詢結果字元集
character_set_database當前資料庫預設字元集
character_set_system系統元資料字元集