萬盛學電腦網

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

MySQL 中文亂碼徹底解決:my.cnf 配置、驗證命令、JDBC 連接參數、UTF8MB4 現代最佳實踐

現象

插入中文顯示「???」或亂碼,查詢報錯 Incorrect string value。

根因

**全鏈路字符集不一致**:客戶端、連接層、服務端、庫、表、列任一環節編碼不匹配即發生轉碼錯誤或截斷。

傳統 GBK 環境配置 (兼容舊系統)

1. 修改 my.cnf / my.ini


[client]
default-character-set=gbk

[mysqld]
character-set-server=gbk
collation-server=gbk_chinese_ci

2. 重啟服務並驗證


mysql -u root -p
> STATUS;
-- 關鍵輸出應全為 gbk:
Server characterset: gbk
Db characterset: gbk
Client characterset: gbk
Conn. characterset: gbk

3. 建庫建表顯式指定


CREATE DATABASE mydb DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
CREATE TABLE t (c VARCHAR(20)) DEFAULT CHARSET=gbk;

4. JDBC 連接參數 (舊版驅動需顯式)


jdbc:mysql://host:3306/mydb?useUnicode=true&characterEncoding=GBK&autoReconnect=true

現代最佳實踐:全鏈路 UTF8MB4 (強烈推薦新項目)

配置文件


[client]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

建庫建表


CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE t (c VARCHAR(100)) DEFAULT CHARSET=utf8mb4;

連接層


-- 客戶端
SET NAMES utf8mb4;

-- JDBC 8.0+ 可無參數自動協商,舊版顯式
jdbc:mysql://host:3306/mydb?characterEncoding=utf8mb4&useSSL=false

驗證命令


SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
-- 應全為 utf8mb4 / utf8mb4_unicode_ci

避坑指南

  • utf8 在 MySQL 中實為 utf8mb3,**不支持 Emoji/補充字符** (4 字節),插入會截斷報錯。**必須用 utf8mb4**。
  • 修改庫/表默認字符集**不影響現有列**,需 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 重寫數據。
  • 連接池 (Druid/HikariCP) 需配置 connectionInitSqls: SET NAMES utf8mb4 確保每次獲取連接重置字符集。
  • mysqldump 導出指定 --default-character-set=utf8mb4 避免導出轉碼錯誤。
copyright © 萬盛學電腦網 all rights reserved