萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 5 中文亂碼問題完整解決方案:從 latin1 遷移到 UTF-8

MySQL 4 升級到 5 時,預設字元集從 latin1 變更為 UTF-8,導致歷史資料出現亂碼。本文記錄透過 mysqldump 指定 latin1 匯出、替換字元集、重新匯入的完整修復流程,並補充應用層連線字元集設定。

問題現場

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
+--------------------------+----------------------------+

伺服器層仍為 latin1,但系統字元集為 utf8,導致存儲與顯示不一致。

修復步驟:匯出 → 替換字元集 → 匯入

1. 以 latin1 匯出(保證原始位元組不轉碼)

mysqldump -hlocalhost -ueygle -p --default-character-set=latin1 blog > blog.sql

打開 blog.sql 確認中文正常顯示(此時檔案實際為 latin1 編碼但視覺正確)。

2. 全域替換字元集宣告

vim blog.sql
:%s/latin1/utf8/g

將所有 CHARSET=latin1、COLLATE=latin1_* 替換為 utf8 對應值。

3. 建立新庫並匯入

mysql -hlocalhost -ueygle -p eyglenew < blog.sql

4. 驗證結果

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| character_set_database   | utf8                       |  ← 已變更
| character_set_server     | latin1                     |  ← 伺服器層未變,但庫/表已為 utf8
+--------------------------+----------------------------+

資料庫、資料表、欄位字元集均為 utf8,中文顯示正常。

應用層連線字元集設定(PHP 範例)

資料庫為 UTF-8 時:

$link = mysql_connect($host, $user, $pass);
mysql_query("SET NAMES 'UTF8'");
mysql_query("SET CHARACTER SET UTF8");
mysql_query("SET CHARACTER_SET_RESULTS='UTF8'");

資料庫為 GBK 時:

mysql_query("SET NAMES 'GBK'");

SET NAMES charset 等同於同時設定 character_set_client、character_set_connection、character_set_results 三個會話變數。

MySQL 設定檔永久修改(my.cnf/my.ini)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

修改後重啟 MySQL 生效。建議使用 utf8mb4 完整支援 4 位元組字元(Emoji、生僻字)。

避坑檢查清單

  • ✅ 匯出時指定 --default-character-set=latin1
  • ✅ SQL 檔案中所有 latin1 替換為 utf8/utf8mb4
  • ✅ 新建資料庫明確指定 CHARACTER SET utf8mb4
  • ✅ 應用程式連線執行 SET NAMES utf8mb4
  • ✅ 終端機/IDE/瀏覽器編碼一致為 UTF-8
copyright © 萬盛學電腦網 all rights reserved