萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

MySQL 字元集修改完整指南:三層級設定與 utf8mb4 遷移實戰

MySQL 字元集配置三層級詳解:會話級、配置檔全域、應用層連線

MySQL 字元集設定分為三個生效層級,理解其優先順序與作用範圍,是解決亂碼、支援 Emoji、實現多語言儲存的關鍵。本文詳細說明三種設定方式、utf8mb4 遷移步驟與驗證方法。

三大設定層級對比

層級生效範圍持久性優先順序適用場景
會話級 (SET)當前連線連線斷開失效最高 (覆蓋全域)測試、特定任務、臨時相容
全域級 (my.cnf)所有新連線重啟服務永久生效中生產環境標準配置
應用層 (連線參數)該應用連線連線存活期間最高 (覆蓋會話/全域)應用程式碼控制,最可靠

方式一:會話級 SET 語法 (立即生效、臨時)

-- 單獨設定各變數
SET [GLOBAL] character_set_client = utf8mb4;
SET [GLOBAL] character_set_connection = utf8mb4;
SET [GLOBAL] character_set_database = utf8mb4;
SET [GLOBAL] character_set_results = utf8mb4;
SET [GLOBAL] character_set_server = utf8mb4;

-- 一鍵設定 (推薦,等同以上 5 項)
SET NAMES 'utf8mb4';
-- 等效於:
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

注意:不加 GLOBAL 僅影響當前會話;加上則影響後續新連線 (需 SUPER 權限)。

方式二:配置檔全域設定 (永久、標準做法)

編輯 my.cnf (Linux) 或 my.ini (Windows):

[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'

# 可選:強制所有連線使用 utf8mb4 (需 5.7+)
# character-set-client-handshake = FALSE

修改後必須重啟 MySQL 服務** 才生效。

方式三:應用程式連線參數 (最推薦、最高優先級)

在連線字串/建構子中显式指定,不依賴伺服器配置:

  • JDBC:jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useUnicode=true
  • PHP PDO:new PDO("mysql:host=...;dbname=...;charset=utf8mb4", ...)
  • Python PyMySQL:charset='utf8mb4'
  • Node.js mysql2:charset: 'utf8mb4'
  • Go sqlx:dsn += "?charset=utf8mb4"
  • C# MySqlConnector:Charset=utf8mb4

utf8 vs utf8mb4:必須遷移的理由

特性utf8 (MySQL 別名 utf8mb3)utf8mb4
最大字節長度3 字節4 字節
支援字元範圍BMP 平面 (基本多文種平面)完整 Unicode (含增補平面)
Emoji 支援❌ 存入變 ????✅ 完美支援
生僻漢字❌ 部分無法儲存✅ 全支援
索引長度限制767 字節 (舊版)767 字節 (5.7.7- / 3072 字節 5.7.7+)

既有資料庫遷移至 utf8mb4 步驟

  1. 完整備份:mysqldump --single-transaction --routines --triggers --events dbname > backup.sql
  2. 修改配置檔:設定 character-set-server = utf8mb4,重啟服務
  3. 資料庫層級:ALTER DATABASE dbname CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  4. 資料表層級:ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. 欄位層級檢查**:SHOW FULL COLUMNS FROM tbl_name 確認 Collation 已更新
  6. 應用層連線參數更新:加入 charset=utf8mb4
  7. 驗證測試:插入 Emoji 😀、生僻字 𠮷、多語言混合,查詢顯示正常

Collation 選擇建議

  • utf8mb4_unicode_ci:UCA 標準排序,準確支援多語言,**推薦預設**
  • utf8mb4_general_ci:舊版簡化排序,速度略快但準確度較低
  • utf8mb4_zh_ci / _0900_ai_ci:中文拼音/筆畫排序 (8.0+)
  • utf8mb4_bin:二進位比較,區分大小寫、重音、寬窄

驗證腳本

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
SELECT @@character_set_database, @@collation_database;
SHOW CREATE DATABASE dbname;
SHOW CREATE TABLE tblname;

總結

MySQL 字元集配置鐵律:
1. **全鏈路 utf8mb4** (Server/Database/Table/Column/Connection)
2. **應用層显式指定 charset=utf8mb4** (最高優先級、最可靠)
3. **新專案預設 utf8mb4**,舊專案計畫遷移
4. 定期驗證 SHOW VARIABLES LIKE 'character_set_%' 確保配置生效

copyright © 萬盛學電腦網 all rights reserved