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

解決 MySQL 導入 SQL 文件亂碼問題:SET NAMES utf8 一行搞定

     編輯:MySQL 資料庫相關知識

導入包含中文的 SQL 文件時,若目標數據庫/表字符集為 UTF-8 但導入會話字符集未正確設置,會導致中文亂碼。根因是客戶端與服務端字符集協商不一致。

現象與根因

  • 目標表:CHARSET=utf8mb4 / COLLATE=utf8mb4_unicode_ci
  • SQL 文件:包含中文 INSERT 語句
  • 導入命令:mysql -uroot -p db_name < backup.sql
  • 結果:中文變為 ??? 或亂碼字符

原因:默認連接字符集可能為 latin1,服務端按 latin1 解碼客戶端發送的字節流,再按 utf8mb4 存儲,雙重編碼錯位導致亂碼。

最簡解決方案

在 SQL 文件第一行添加:

/*!40101 SET NAMES utf8mb4 */;

或命令行指定:

mysql --default-character-set=utf8mb4 -uroot -p db_name < backup.sql

機制解析

  • /*!40101 ... */:版本註釋語法,MySQL 4.1.1+ 執行,舊版本忽略,兼容性極佳
  • SET NAMES utf8mb4 等價於三條語句:
    • SET character_set_client = utf8mb4
    • SET character_set_connection = utf8mb4
    • SET character_set_results = utf8mb4
  • 確保「客戶端發送編碼 → 服務端解碼 → 內部存儲」全鏈路 UTF-8 一致

完整字符集檢查清單

層級檢查項推薦值
服務端character_set_serverutf8mb4
服務端collation_serverutf8mb4_unicode_ci
數據庫DEFAULT CHARACTER SETutf8mb4
表DEFAULT CHARSETutf8mb4
列CHARACTER SETutf8mb4
連接SET NAMES / --default-character-setutf8mb4
應用JDBC/PDO/PHP mysqli 連接參數charset=utf8mb4

常見誤區

  1. 使用 utf8 而非 utf8mb4:utf8 僅支援 BMP 平面(3 字節),無法存儲 Emoji 等補充字符
  2. 只修改表字符集不轉換數據:ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 才會真正轉換已有數據
  3. 忽略連接字符集:應用代碼中建立連接後必須執行 SET NAMES utf8mb4

一行 SET NAMES utf8mb4,解決 90% 導入亂碼問題。建立全鏈路 UTF-8MB4 規範,從根源消除編碼困擾。

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