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

MySQL 修改表/欄位字符集完整指南:CONVERT TO vs DEFAULT CHARACTER SET

     編輯:MySQL 綜合教學

MySQL 字符集修改分兩層級:表預設字符集與現有欄位實際字符集。本文釐清 CONVERT TO CHARACTER SET、DEFAULT CHARACTER SET、單欄位 CHANGE 三種操作的差異、適用場景與避坑指南。

操作對照表

指令影響範圍資料轉換適用場景
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4表預設 + **所有字符型欄位****是** (按字符集轉換資料)整表遷移至新字符集
ALTER TABLE t DEFAULT CHARACTER SET utf8mb4僅表預設字符集**否** (現有欄位不變)新增欄位自動用新字符集
ALTER TABLE t CHANGE c c VARCHAR(100) CHARACTER SET utf8mb4單一欄位**是**局部欄位遷移

關鍵陷阱:資料與聲明字符集不一致

若欄位聲明 gb2312 但實際存儲 utf8 資料,直接 CONVERT TO 會按 gb2312 解碼再編碼為 utf8mb4,導致亂碼。

安全遷移三步法

-- 1. 先轉為二進制,不做任何轉換
ALTER TABLE t CHANGE c c BLOB;

-- 2. 再轉為目標字符集,聲明正確編碼
ALTER TABLE t CHANGE c c TEXT CHARACTER SET utf8mb4;

-- 3. 驗證資料正確
SELECT HEX(c), c FROM t LIMIT 10;

原理:BLOB 無字符集屬性,轉換時不做編碼轉換,僅改變元資料。

二進制字符集特殊行為

ALTER TABLE t CONVERT TO CHARACTER SET binary;
  • CHAR → BINARY、VARCHAR → VARBINARY、TEXT → BLOB。
  • 轉為 binary 後,**失去字符集資訊**,後續 CONVERT TO 不再生效。
  • 慎用,除非確定要移除字符集語意。

完整遷移範例:gb2312 → utf8mb4

-- 1. 檢查現狀
SHOW CREATE TABLE t;
SELECT COLUMN_NAME, CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='t';

-- 2. 整表轉換 (資料已符合聲明編碼)
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 3. 或分欄位轉換 (資料與聲明不符時)
ALTER TABLE t CHANGE c c BLOB;
ALTER TABLE t CHANGE c c VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 4. 修改表預設,供後續新增欄位使用
ALTER TABLE t DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

驗證清單

  • SHOW CREATE TABLE 確認欄位/表字符集已更新。
  • SELECT HEX(col), col 對比十六進制與顯示字符,確認無亂碼。
  • 應用端連線字符集同步設定 SET NAMES utf8mb4。

區分「表預設」與「欄位實際」,選對指令,配合 BLOB 中轉避開編碼陷阱,即可安全完成字符集遷移。

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