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

MySQL 亂碼終極解決方案:my.ini 三級配置、SET NAMES、連接字串、建庫指定編碼全鏈路統一

     編輯:MySQL 綜合教學

MySQL 中文亂碼本質是「編碼鏈路不一致」。本文彙總「伺服器配置 → 連接參數 → 建庫語句 → 會話指令」四層統一策略,針對 Windows/Linux、MySQL 4.x/5.x/8.x、JDBC/PHP/命令列等多環境給出標準化解決方案,附帶驗證指令與常見誤區。

核心原則:全鏈路 UTF-8 (推薦 utf8mb4)

資料庫 ←→ 連接 ←→ 應用 ←→ 瀏覽器,每一環編碼必須完全一致。

一、伺服器配置文件 (my.ini / my.cnf)

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
# skip-character-set-client-handshake  # 強制忽略客戶端編碼請求,慎用

修改後 必須重啟 MySQL 服務 生效。

二、建庫/建表顯式指定編碼

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

避免依賴伺服器預設值,顯式聲明最保險。

三、連接字串 / 會話指定編碼

jdbc:mysql://host:3306/db?characterEncoding=utf8&useSSL=falsejdbc:mysql://host:3306/db?characterEncoding=utf8mb4&serverTimezone=Asia/Shanghaimysqli_set_charset($link, 'utf8mb4');new PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pwd);SET NAMES 'utf8mb4';cursor.execute("SET NAMES 'utf8mb4'")
環境配置範例
JDBC (MySQL 5.0+)
JDBC (8.0+)
PHP (mysqli)
PHP (PDO)
命令列會話
Python (MySQLdb)

四、驗證編碼一致性

SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb4                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

八個 character_set_* 全為 utf8mb4 (除 filesystem) 即為完全一致。

五、Windows DOS 環境特殊處理

# 進入 MySQL 前執行
chcp 65001  # 切換代碼頁到 UTF-8
mysql -u root -p --default-character-set=utf8mb4

六、常見誤區與避坑

誤區後果正確做法
只改 my.ini 不重啟配置不生效修改後必須 restart service
只設連接字串不改庫編碼新表仍用預設 latin1建庫/建表顯式 CHARSET=utf8mb4
用 utf8 而非 utf8mb4Emoji/生僻字存成 ??全鏈路 utf8mb4 (5.5.3+)
SET NAMES 'utf8' (無 mb4)截斷 4 字節字符SET NAMES 'utf8mb4'
PHP header() 設編碼但 DB 連接未設讀出亂碼mysqli_set_charset / PDO charset 參數

七、歷史版本差異速查

  • MySQL 4.1:需 useUnicode=true&characterEncoding=gbk/utf8
  • MySQL 5.0+:characterEncoding=utf8 即可,useUnicode 可省略
  • MySQL 5.5.3+:引入 utf8mb4,建議全面遷移
  • MySQL 8.0+:預設 utf8mb4、caching_sha2_password,驅動需 8.0+

總結

「my.ini 三段配置 + 建庫顯式編碼 + 連接字串 charset + 會話 SET NAMES」四步走,配合 SHOW VARIABLES LIKE 'character%' 驗證,MySQL 中文亂碼問題可徹底根治。建議將此流程寫入團隊《資料庫交付檢查清單》,新環境部署逐項打勾。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved