首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 中文亂碼終極大全:從 4.0 升級到 8.0 的字符集遷移、連接協商、導入導出全鏈路

     編輯:MySQL 資料庫相關知識

MySQL 4.1 引入字符集體系後,亂碼本質是「存儲編碼、連接編碼、結果編碼、客戶端編碼」四端不一致。本文覆蓋歷史版本遷移、PHP/Java/C# 連接、導入導出、phpMyAdmin 等全場景。

核心原理:四大編碼

階段系統變量作用
客戶端發送character_set_client客戶端聲明「我發送什麼編碼」
服務端接收character_set_connection服務端按此將 SQL 文本轉為內部編碼
數據存儲表/列 CHARSET實際落盤編碼
結果返回character_set_results服務端聲明「我返回什麼編碼」

SET NAMES utf8mb4 一次性設定前三者;SET CHARACTER SET utf8mb4 等價於前兩者 + results=client。

場景化解決方案

1. PHP 連接(mysqli/PDO)


$mysqli = new mysqli('localhost','root','pwd','db');
$mysqli->set_charset('utf8mb4');  // 必須在查詢前
// PDO
$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'root', 'pwd');

2. Java JDBC


url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai
// 驅動 5.1.47+ / 8.0.13+

3. Python PyMySQL


conn = pymysql.connect(host='localhost', user='root', password='pwd', db='db', charset='utf8mb4')

4. 歷史庫遷移(4.0→5.x/8.0)

  1. 導出時指定舊編碼:mysqldump --default-character-set=latin1 -uroot -p db > dump.sql
  2. 導入文件頭部加:SET NAMES latin1;(告知服務端文件編碼)。
  3. 導入:mysql --default-character-set=utf8mb4 -uroot -p db < dump.sql(服務端按 utf8mb4 接收並轉存)。
  4. 驗證:SELECT HEX(col) FROM t WHERE col LIKE '%中%'; 應見 E4B8AD (utf8mb4) 而非 D6D0 (gbk)。

5. phpMyAdmin 設置

  • 語言選 Chinese Simplified (zh-utf-8)。
  • 「MySQL 連接校對」選 utf8mb4_general_ci。
  • 導入頁面「文件字符集」按源文件實際編碼選(常見 utf8/gbk/latin1)。

6. 緊急修復:iconv 轉碼


# 導出文件 utf8→gbk
iconv -c -f utf8 -t gbk dump.sql > dump_gbk.sql
# 導入文件 gbk→utf8
iconv -c -f gbk -t utf8 dump.sql > dump_utf8.sql

最佳實踐清單

  1. 全鏈路統一 utf8mb4(庫、表、列、連接、客戶端、HTML meta、HTTP header)。
  2. 連接建立後第一條語句執行 SET NAMES utf8mb4。
  3. 驅動版本:JDBC 8.0.13+、PHP mysqli 原生、Python PyMySQL 1.0+、Go github.com/go-sql-driver/mysql 1.5+。
  4. 備份腳本固化 --default-character-set=utf8mb4。
  5. 監控 SHOW VARIABLES LIKE 'character_set_%'; 定期巡檢。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved