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

MySQL 存儲越南文亂碼徹底解決:字段級字符集修改實戰

     編輯:MySQL 資料庫相關知識

問題現象

應用層已設置 `SET NAMES UTF8`,連接字符集正確,但插入越南文 (如 `Tiếng Việt`) 後查詢顯示為 `????` 或亂碼。

根因分析

  1. 數據庫/表默認字符集為 `gbk` (或 `latin1`),**不支持越南文字符**。
  2. 雖然連接層轉換正確,但**存儲層字符集不支持**,導致寫入時字符丟失/替換為 `?`。
  3. **關鍵點**:修改表默認字符集 `ALTER TABLE ... CHARSET=utf8` **不會自動轉換已有字段字符集**,字段仍保持原字符集 (如 `gbk`),故不起作用。

解決方案:修改具體字段字符集

必須針對存儲越南文的**具體字段**執行 `CHANGE` 或 `MODIFY` 指定 `CHARACTER SET utf8` (或 `utf8mb4`)。

實戰 SQL

-- 假設數據庫 php_college_web,表 city_article,字段 title, content
ALTER TABLE `city_article` 
CHANGE `title` `title` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;

ALTER TABLE `city_article` 
CHANGE `content` `content` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;

參數說明

  • `CHANGE 旧列名 新列名 类型 CHARACTER SET utf8 COLLATE utf8_unicode_ci`:重新定義列,指定字符集與校對規則。
  • `utf8_unicode_ci`:基於 Unicode 排序規則,對越南文等多語言支持較好。也可用 `utf8_general_ci` (速度快、準確度略低) 或 `utf8_vietnamese_ci` (專門針對越南文,MySQL 8.0+ 支持)。
  • 建議升級至 **`utf8mb4`** (支持 4 字節字符如 Emoji):`CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`。

驗證修改結果

-- 查看表結構確認字段字符集
SHOW CREATE TABLE city_article;
-- 或
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA='php_college_web' AND TABLE_NAME='city_article';

完整最佳實踐清單

層級配置項推薦值
數據庫默認字符集`CREATE DATABASE ... CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`
表默認字符集`CREATE TABLE ... CHARSET=utf8mb4;` (新表生效,舊表字段需單獨改)
字段字符集/校對`VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`
連接應用層`SET NAMES utf8mb4` / 連接池配置 `characterEncoding=utf8mb4`
配置文件my.cnf`character-set-server=utf8mb4`, `collation-server=utf8mb4_unicode_ci`

避坑指南

  • ❌ 僅執行 `ALTER TABLE t CHARSET=utf8` → **無效**,字段字符集不變。
  • ❌ 僅修改連接字符集 `SET NAMES utf8` → **無效**,存儲層不支持。
  • ✅ **逐字段修改** `CHANGE/MODIFY ... CHARACTER SET utf8mb4` → **有效**。
  • ⚠️ 大表修改字段字符集會鎖表重建,建議低峰期操作或使用 `pt-online-schema-change` / `gh-ost` 在線變更。

總結

MySQL 字符集生效遵循**就近原則**:字段 > 表 > 庫 > 服務器。存儲多語言 (越南文、日文、Emoji 等) 時,**務必將字段字符集顯式設置為 `utf8mb4`**,並配合 `utf8mb4_unicode_ci` 校對規則,同時確保連接層一致。這是解決亂碼的根本之道。

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