MySQL 預設字符集 latin1 不支援中文,導致存入漢字變「???」。本文提供 Linux 修改 my.cnf、Windows 修改 my.ini 的標準化流程,統一設置為 utf8mb4 (支援 Emoji) 徹底根治亂碼。
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+----------------------------+
# 1. 停止服務
systemctl stop mysqld
# 2. 編輯配置文件 (在 [mysqld] 區段下添加)
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
# 3. 重啟服務
systemctl start mysqld
# 4. 驗證
mysql> SHOW VARIABLES LIKE 'character_set_%';
# 應全部顯示 utf8mb4 (除 filesystem=binary, system=utf8)
net stop MySQL (或服務管理器)。my.ini (記事本/Notepad++ 以 UTF-8 無 BOM 保存),修改/添加:[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
net start MySQL。jdbc:mysql://host:3306/db?characterEncoding=utf8&useUnicode=true&serverTimezone=Asia/Shanghai (MySQL 8.0+ 驅動可省略)。new PDO("mysql:host=...;dbname=...;charset=utf8mb4", ...)。charset='utf8mb4' 參數。<%@ page contentType="text/html;charset=UTF-8" %> (舊 ISO-8859-1 為亂碼根源)。| 現象 | 原因 | 解決 |
|---|---|---|
| 配置生效但存入仍亂碼 | 應用層連接未指定字符集 | 檢查連接串/代碼必帶 charset=utf8mb4 |
| Emoji 存入報錯/變 ? | 表/欄位仍為 utf8 (僅 3 字節) | ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4; |
| 舊數據已亂碼 | 歷史髒數據 | 需按原編碼導出 → 修正 → 重新導入,或用工具修復 |
一句話總結: **服務端 utf8mb4 + 客戶端連接指定 utf8mb4 + 表欄位 utf8mb4 + 頁面 UTF-8** 四位一體,中文亂碼零發生。