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

MySQL 導入腳本文件顯示亂碼解決:SET NAMES、客戶端字符集、文件編碼三層一致性原則

     編輯:MySQL 綜合教學

現象


mysql> source /path/to/backup.sql;
-- 或
mysql -uroot -p < backup.sql
-- 導入後中文顯示亂碼:????、、錯誤字符

根因:三層編碼不一致

  1. SQL 文件物理編碼:文件保存時的編碼 (UTF-8 / GBK / GB2312)。
  2. MySQL 客戶端連接字符集:`SET NAMES charset` / `--default-character-set`。
  3. 目標表/列字符集:`CHARACTER SET utf8mb4` / `gbk`。

**鐵律:** 文件編碼 = 連接字符集 = 目標字符集 (或隱式轉換無損)。

即時解決:導入前 SET NAMES


mysql> SET NAMES gbk;          -- 若文件是 GBK 編碼
mysql> SOURCE /path/to/backup.sql;

-- 或命令行指定
mysql --default-character-set=gbk -uroot -p < backup.sql

文件編碼檢測與轉換


# Linux 檢測
file backup.sql
# 輸出: UTF-8 Unicode text / ISO-8859 text (GBK 常被誤判)

# 確認含中文行
head -n 20 backup.sql | cat -A

# 轉換 (iconv)
iconv -f GBK -t UTF-8 backup.sql > backup_utf8.sql
iconv -f UTF-8 -t GBK backup_utf8.sql > backup_gbk.sql

永久配置:my.cnf 統一字符集


[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'

重啟服務生效。新連接自動 `SET NAMES utf8mb4`,UTF-8 文件無需手動指定。

避坑清單

坑點後果解決
文件 UTF-8,連接 GBK中文變 ???? (無法映射)統一為 UTF-8/utf8mb4
文件 GBK,連接 UTF-8中文變 (無效字節序列)轉換文件或連接指定 GBK
目標表 latin1,存 UTF-8 數據雙重編碼亂碼,不可逆`ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4`
Windows 記事本保存為 ANSI (實為 GBK)導入 Linux MySQL (默認 UTF-8) 亂碼另存為 UTF-8 (帶 BOM 或無 BOM 均可)
mysqldump 導出未指定字符集默認連接字符集導出,導入環境不同則亂碼`mysqldump --default-character-set=utf8mb4`

最佳實踐

  1. **全鏈路 utf8mb4**:文件、連接、庫、表、列、應用、前端。
  2. **導出指定字符集**:`mysqldump --default-character-set=utf8mb4`。
  3. **導入指定字符集**:`mysql --default-character-set=utf8mb4 < dump.sql`。
  4. **驗證**:導入後 `SELECT HEX(col), col FROM tbl LIMIT 1;` 檢查十六進制編碼正確性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved