首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 中文亂碼排查實戰:從現象到根因的完整分析流程

     編輯:MySQL 綜合教學

前言

中文亂碼問題看似簡單,實則涉及 Web 前端、後端編碼、JDBC 連接參數、MySQL 多層字符集設定。本文以一個真實 JavaEE 專案案例為主線,展示從「發現亂碼」到「定位資料庫層」再到「逐層修正 Server/Database/Table/Column 字符集」的完整排查思路與操作步驟。

案例現場

  • 環境:JavaEE + MySQL 5.0(舊版本,原理通用)
  • 現象:新增用戶,userName 欄位存入 ????
  • 初步判斷:Web 端已排查(Filter 設定 UTF-8、JSP pageEncoding、Tomcat URIEncoding),鎖定資料庫層。

步驟一:查看資料庫實際字符集狀態


mysql> STATUS;
--------------
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
--------------

**結論**:四層均為 latin1,中文必定亂碼。

步驟二:修正 Server/Client/Connection 字符集

方案 A:Windows 安裝精靈重配置(適用舊版 Windows 安裝包)

  1. 執行 MySQL Server Instance Configuration Wizard
  2. 選擇 Detailed Configuration → Developer Machine → Multifunctional Database(第三項)
  3. 字符集選擇 gbk(或 utf8)
  4. 執行完成,重啟服務

結果:Server/Client/Conn. 變為 gbk,但 Db characterset 仍為 latin1。

方案 B:修改配置檔 my.ini(通用、推薦)


[mysqld]
default-character-set = gbk
character-set-server = gbk

[client]
default-character-set = gbk

重啟服務,效果同方案 A。

步驟三:修正 Database 字符集


ALTER DATABASE steven CHARACTER SET gbk;

再次 STATUS,四層皆為 gbk。此時若無歷史資料,通常已解決。

步驟四:遭遇 Data too long 異常 → 修正 Table/Column 字符集

插入中文報錯:


com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'userName' at row 1

檢查表結構:


SHOW CREATE TABLE t_user;
-- 發現:DEFAULT CHARSET=latin1,欄位 CHARACTER SET latin1

**根因**:Database 已改為 gbk,但既有表/欄位仍為 latin1。中文字符在 gbk 佔 2 字節,latin1 視為 2 個字符,導致長度超過 VARCHAR(100) 限制(實際存 200 字節)。

修正方案(二選一)

方案 1:重建表(乾淨、推薦無歷史資料)


DROP TABLE t_user;
CREATE TABLE t_user (
  userId INT PRIMARY KEY AUTO_INCREMENT,
  userName VARCHAR(100) NOT NULL,
  age INT,
  birthday DATETIME,
  isVip BOOLEAN
) DEFAULT CHARSET=gbk;

方案 2:就地轉換(保留資料)


ALTER TABLE t_user CHARACTER SET gbk;
ALTER TABLE t_user MODIFY userName VARCHAR(100) CHARACTER SET gbk;

轉換後再次插入,中文正常顯示。

總結:MySQL 中文亂碼標準解決流程

  1. 全域字符集統一:my.cnf / 安裝精靈設定 character-set-server = utf8mb4(現代建議)或 gbk/utf8。
  2. Database 字符集:ALTER DATABASE db_name CHARACTER SET utf8mb4。
  3. Table/Column 字符集:ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4(轉換資料)或 MODIFY COLUMN ... CHARACTER SET utf8mb4。
  4. 連接參數:JDBC URL characterEncoding=utf8mb4 或執行 SET NAMES utf8mb4。
  5. 驗證:SHOW VARIABLES LIKE 'character_set%'、SHOW CREATE TABLE、實際寫讀測試。

常用修正指令速查


SET NAMES 'gbk';  -- 相當於設定 client/connection/results
SET CHARACTER_SET_CLIENT = gbk;
SET CHARACTER_SET_RESULTS = gbk;
SET CHARACTER_SET_CONNECTION = gbk;

SHOW CREATE TABLE t_user;
ALTER DATABASE steven CHARACTER SET gbk;
ALTER TABLE t_user CHARACTER SET gbk;
ALTER TABLE t_user MODIFY userName VARCHAR(100) CHARACTER SET gbk;

CREATE TABLE t_user (...) DEFAULT CHARSET=gbk;

避坑提醒

  • utf8 ≠ utf8mb4,**新專案務必用 utf8mb4** 支援 Emoji 與補充平面字符。
  • CONVERT TO 會重建表並轉換資料位元組,大表需用 pt-osc/gh-ost。
  • 若轉換後出現繁體,嘗試 SET NAMES 'gbk' 強制解碼(僅適用舊資料遷移場景)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved