環境:MySQL 5.7.12。遇到中文插入報錯 Incorrect string value 或存入後顯示 ??,核心原因是字元集設定不一致。本文提供分層解決方案。
| 症狀 | 錯誤訊息 | 原因 |
|---|---|---|
| 插入失敗 | Incorrect string value: '\xCD\xF5...' for column 'Sname' at row 1 | 連線字元集非 utf8,無法識別中文編碼 |
| 插入成功但顯示問號 | 資料庫呈現 ?? | 儲存層字元集非 utf8,資料寫入時已損毀 |
Windows (my.ini):
[mysqld] # 必須放在 [mysqld] 區塊最下方,藍框標示位置 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci # 可選:客戶端預設 [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4

Linux (my.cnf):同樣在 [mysqld] 區段加入上述兩行。修改後 必須重啟 MySQL 服務 生效。
若方案一無效,通常是連線層未指定編碼。在 JDBC URL 追加參數:
jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Taipei
useUnicode=true:啟用 UnicodecharacterEncoding=UTF-8:指定傳輸編碼serverTimezone:避免時區警告 (5.7+ 建議加上)# 資料庫層級 ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci; # 資料表層級 ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 欄位層級 (若僅特定欄位需支援中文) ALTER TABLE tbl_name MODIFY col_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# 檢查伺服器變數 SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; # 期望結果 (關鍵項) +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_server | utf8mb4 | | character_set_database | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_client | utf8mb4 | | character_set_results | utf8mb4 | | collation_server | utf8mb4_general_ci | +--------------------------+---------+
utf8 而非 utf8mb4:MySQL 的 utf8 僅支援 3 位元組字元 (BMP),無法儲存 Emoji 或生僻字,務必使用 utf8mb4。character-set-server 必須在 [mysqld] 區塊,放在 [client] 或 [mysql] 無效。systemctl restart mysqld 或 net restart mysql。my.cnf 設定 character-set-server=utf8mb4 並重啟。utf8mb4。useUnicode=true&characterEncoding=UTF-8。SHOW VARIABLES LIKE 'character_set%'; 確認關鍵變數皆為 utf8mb4。依序套用上述方案,可徹底解決 MySQL 中文亂碼問題。建議新專案一開始就統一採用 utf8mb4 避免後續麻煩。