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

MySQL 中文亂碼問題徹底解決:my.cnf、db.opt、JDBC 全鏈路配置指南

     編輯:MySQL 綜合教學

MySQL 中文亂碼問題徹底解決:全鏈路配置指南

問題現象

  • JDBC 寫入中文,數據庫顯示 ?? 或亂碼
  • 控制台查詢顯示亂碼
  • 報錯:Incorrect string value (Error 1366)

核心配置文件修改

1. my.cnf / 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'  # 非 root 連接自動執行

關鍵點:5.5+ 必須用 character-set-server,勿用廢棄的 default-character-set。

2. 數據庫級配置
-- 查看庫編碼
SHOW CREATE DATABASE db_name;

-- 修改庫預設編碼(僅影響後續新表)
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改表編碼(轉換現有數據)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. db.opt(舊版 MySQL 數據庫目錄下的配置文件)
default-character-set=utf8mb4
default-collation=utf8mb4_unicode_ci

驗證配置生效

SHOW VARIABLES LIKE '%char%';
SHOW VARIABLES LIKE '%colla%';

期望輸出關鍵變數均為 utf8mb4 / utf8mb4_unicode_ci:

  • character_set_client
  • character_set_connection
  • character_set_database
  • character_set_results
  • character_set_server
  • collation_connection
  • collation_database
  • collation_server

JDBC 連接配置

# MySQL 5.1/5.5 (Connector/J 5.1)
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true

# MySQL 8.0+ (Connector/J 8.0) 默認 UTF-8,通常無需指定
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai

應用層代碼確認

  • Java:new String(bytes, "UTF-8") 讀取、str.getBytes("UTF-8") 寫入
  • Python:# -*- coding: utf-8 -*-、連接指定 charset='utf8mb4'
  • PHP:mysqli_set_charset($conn, 'utf8mb4') 或 PDO DSN charset=utf8mb4
  • HTML 頁面:<meta charset="UTF-8">

排查清單(由外而內)

  1. 頁面/終端編碼是否 UTF-8
  2. 應用代碼讀寫是否指定 UTF-8
  3. JDBC/驅動連接參數是否含 characterEncoding=utf8mb4
  4. MySQL 會話變數 character_set_client/connection/results 是否 utf8mb4
  5. 表/欄位定義字符集是否 utf8mb4
  6. 數據庫預設字符集是否 utf8mb4
  7. 服務端配置 character-set-server=utf8mb4 是否生效

為什麼推薦 utf8mb4 而非 utf8

特性utf8 (utf8mb3)utf8mb4
最大字節數3 字節4 字節
Emoji 支援❌✅
生僻字支援部分缺失完整 Unicode BMP + 補充平面
索引長度限制767 字節767 字節 (5.7+) / 3072 字節 (8.0+ innodb_large_prefix)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved