字符集決定資料如何編碼儲存,校對規則決定如何比較排序。選型錯誤會導致亂碼、索引失效、排序錯誤。本文系統梳理選型依據、四級預設層級與客戶端連線字符集配置。
| 場景 | 推薦字符集 | 理由 |
|---|---|---|
| 多語言/國際化/Emoji | utf8mb4 | 完整 Unicode,4 字節支援輔助平面 |
| 純中文、極度追求空間/效能 | gbk | 雙字節固定長,漢字佔 2 字節 vs utf8mb4 3-4 字節 |
| 以英文/數字為主 | utf8mb4 | ASCII 兼容,單字節,通用性最強 |
| 大量字串運算/排序 | 定長字符集 (ucs2/utf16) | 避免變長編碼計算開銷 |
| 舊系統遷移、相容性優先 | 沿用原字符集 | 避免資料轉換風險 |
my.cnf character-set-server=utf8mb4CREATE DATABASE db CHARSET utf8mb4CREATE TABLE t (...) CHARSET utf8mb4col VARCHAR(100) CHARSET utf8mb4越低層級優先級越高。建議 Server/Database 統一 utf8mb4,Table/Column 僅在特殊需求覆蓋。
utf8mb4_general_ci 不區分大小寫、utf8mb4_bin 二進位比較、utf8mb4_0900_ai_ci 8.0 預設、支援重音不敏感)。character_set_client -- 客戶端發送 SQL 的編碼 character_set_connection -- 連線層轉換目標編碼 character_set_results -- 伺服器返回結果編碼
一鍵設定:SET NAMES utf8mb4(等同設定以上三者)。
持久化:my.cnf [client] default-character-set=utf8mb4。
| 現象 | 根因 | 修正 |
|---|---|---|
| 存入中文變 ??? | 表/欄位字符集非 utf8mb4 | ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 |
| 讀出亂碼 | 連線字符集與儲存不一致 | SET NAMES utf8mb4 / 應用層連線池配置 |
| Emoji 截斷/報錯 | 使用 utf8(3 字節)而非 utf8mb4 | 全鏈路升級 utf8mb4 |
| 排序錯誤 | 校對規則不符預期 | 指定 COLLATE utf8mb4_0900_ai_ci |
新專案無條件選 utf8mb4 + utf8mb4_0900_ai_ci。舊專案評估遷移成本後統一升級。全鏈路(Server/DB/Table/Column/Connection/Application)字符集一致,是杜絕亂碼的唯一鑰匙。