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

MySQL 字元集完整設定指南:從連線層到儲存層徹底解決亂碼問題

     編輯:MySQL 資料庫相關知識

為什麼 MySQL 字元集容易出問題?

MySQL 涉及 四層字元集設定,任一層不一致即會導致亂碼:

  1. Client:應用程式/驅動發送 SQL 的編碼
  2. Connection:Server 接收並轉換的編碼
  3. Database/Table/Column:資料實際儲存編碼
  4. Results:Server 回傳結果集的編碼

一、臨時修改 (僅影響目前 Session)

SET NAMES utf8mb4;  -- 等同於同時設定 client、connection、results 三個變數
-- 或分別設定
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

適用場景:緊急測試、單次腳本執行。**重新連線即失效**。

二、永久修改:配置檔 my.cnf / my.ini (根治方案)

Linux/macOS: /etc/my.cnf 或 /etc/mysql/my.cnf

Windows: 安裝目錄下 my.ini

[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'  -- 針對非超級用戶自動執行
skip-character-set-client-handshake  -- 強制忽略客戶端請求的字元集
💡 關鍵差異:utf8mb4 支援完整 Unicode (含 Emoji、生僻字),utf8 (實為 utf8mb3) 僅支援 BMP 平面。**新專案一律使用 utf8mb4**。

修改後**重啟 MySQL 服務**生效:

# Linux
systemctl restart mysqld
# 或
service mysql restart

# Windows (管理員 CMD)
net stop mysql
net start mysql

三、驗證設定是否生效

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

預期結果 (關鍵變數皆為 utf8mb4):

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb4                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+

四、既有資料庫/資料表/欄位修改字元集

1. 修改資料庫預設字元集 (僅影響後續建立的表)

ALTER DATABASE `your_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

2. 修改資料表字元集 (含轉換既有資料)

-- 僅修改預設 (不轉換既有資料)
ALTER TABLE `your_table` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- **完整轉換** (含既有資料重新編碼) - 推薦
ALTER TABLE `your_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 修改單一欄位字元集

ALTER TABLE `your_table` 
CHANGE `col_name` `col_name` VARCHAR(191) 
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci 
NOT NULL;
⚠ 索引長度限制:utf8mb4 每字元 4 bytes,InnoDB 單欄索引上限 767 bytes (或 innodb_large_prefix=ON 時 3072 bytes)。
VARCHAR(191) = 191×4=764 bytes < 767 ✓
VARCHAR(255) = 1020 bytes > 767 ✗ (需開啟 innodb_large_prefix)

五、應用程式端配置 (關鍵!)

JDBC (Java)

jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Taipei

PHP (PDO)

$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass);
$pdo->exec("SET NAMES utf8mb4");

Python (PyMySQL / mysqlclient)

conn = pymysql.connect(host='localhost', user='root', password='pwd', 
                       db='test', charset='utf8mb4')

.NET (MySqlConnector / MySql.Data)

Server=localhost;Database=test;Uid=root;Pwd=pwd;CharSet=utf8mb4;

六、排查亂碼快速檢查清單

現象可能原因檢查順序
存入 ??? 或 Client/Connection 非 utf8mb41. 應用連線字串 2. my.cnf [client] 3. SET NAMES
讀出亂碼 (如 鏂板)Results 非 utf8mb41. 應用連線字串 2. my.cnf [mysql] 3. character_set_results
截斷/報錯 Data too long欄位長度按字元數計算,但 utf8mb4 佔 4 bytes檢查 VARCHAR 長度、索引限制、innodb_large_prefix
排序錯誤 (中文不按拼音)Collation 不支援中文排序改用 utf8mb4_unicode_ci 或 utf8mb4_zh_0900_as_cs (MySQL 8.0+)

七、MySQL 8.0 新預設與最佳實踐

  • 預設字元集:utf8mb4,預設排序規則:utf8mb4_0900_ai_ci
  • 新增 utf8mb4_zh_0900_as_cs 等語系專用排序規則
  • 建議新專案直接使用 MySQL 8.0+,免去手動配置 utf8mb4 的麻煩

徹底理解並統一四層字元集設定,配合應用端正確連線參數,即可從根源杜絕 MySQL 亂碼問題,支援全球化應用的完整 Unicode 需求。

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