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

MySQL 4.1 資料編碼轉換全攻略:從 GB2312 遷移至 UTF-8 的關鍵步驟與避坑指南

     編輯:MySQL 資料庫相關知識

背景與挑戰

MySQL 4.1 引入完整字元集支援,使舊版資料(通常為 GB2312/GBK 編碼)遷移至 UTF-8 成為常見需求。轉換過程若處理不當,易導致亂碼、匯入失敗或效能問題。本文整理實戰經驗,提供標準化操作流程。

核心轉換流程

1. 備份原始資料

使用 mysqldump 匯出結構與資料:

mysqldump -u root -p --add-drop-table --extended-insert database_name > backup.sql
  • --add-drop-table:匯入時自動刪除舊表,簡化操作。
  • --extended-insert:多行合併 INSERT,避免單一 SQL 過大導致錯誤。

2. 檔案編碼轉換與 SQL 修正

  1. 使用 EmEditor、Notepad++ 或 iconv 將 backup.sql 從 GB2312 轉為 UTF-8 無 BOM 格式。
    iconv -f gb2312 -t utf-8 backup.sql > backup_utf8.sql
  2. 全域替換字元集宣告:
    gbk_bin → utf8_general_ci
    gbk → utf8
  3. 檔案最前端插入:SET NAMES utf8;

關鍵提醒:UTF-8 檔案不可包含 BOM,否則 mysql 客戶端會報語法錯誤(ERROR 1064)。

3. 建立新資料庫並匯入

mysql -u root -p -e "CREATE DATABASE new_db CHARACTER SET utf8 COLLATE utf8_general_ci;"
mysql -u root -p new_db < backup_utf8.sql

4. 解決「封包過大」錯誤

若匯入報 Got a packet bigger than 'max_allowed_packet',修改 my.ini(Windows)或 my.cnf(Linux)[mysqld] 區段:

max_allowed_packet = 16M

重啟服務生效。

應用層配合調整

資料庫連線設定

PHP 範例:

mysql_query("SET NAMES 'utf8'");

程式碼與模板檔案編碼轉換

  • 使用 iconv 批次轉換 PHP/HTML 模板檔:
    iconv -f gb2312 -t utf-8 input.php > output.php
  • 修改 HTML Meta 標籤:
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

常見陷阱總結

問題原因解決
匯入報錯 ERROR 1064 損壞字元SQL 檔案含 BOM另存為 UTF-8 無 BOM
中文顯示亂碼連線未設 SET NAMES utf8應用程式連線後立即執行
大量資料匯入失敗max_allowed_packet 過小調大至 16M-64M 並重啟

結語

編碼遷移核心在於「備份→轉檔→修正 SQL→匯入→驗證→應用層配合」六步驟。嚴格遵循無 BOM 原則、統一字元集宣告、預留足夠封包大小,即可平滑完成 GB2312 到 UTF-8 的遷移。

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