應用層已設置 `SET NAMES UTF8`,連接字符集正確,但插入越南文 (如 `Tiếng Việt`) 後查詢顯示為 `????` 或亂碼。
必須針對存儲越南文的**具體字段**執行 `CHANGE` 或 `MODIFY` 指定 `CHARACTER SET utf8` (或 `utf8mb4`)。
-- 假設數據庫 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;
-- 查看表結構確認字段字符集
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` |
MySQL 字符集生效遵循**就近原則**:字段 > 表 > 庫 > 服務器。存儲多語言 (越南文、日文、Emoji 等) 時,**務必將字段字符集顯式設置為 `utf8mb4`**,並配合 `utf8mb4_unicode_ci` 校對規則,同時確保連接層一致。這是解決亂碼的根本之道。