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

MySQL 亂碼問題徹底解決:字元集診斷、資料庫/資料表/欄位層級轉換實戰

     編輯:MySQL 綜合教學

一、快速診斷:目前字元集是什麼?

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

重點觀察:character_set_server、character_set_database、character_set_client/connection/results。

二、層級修正策略 (由大到小)

1. 伺服器級 (my.cnf) — 影響新建庫/表

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

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

systemctl restart mysqld 生效。

2. 資料庫級 — 僅影響後續新建表

ALTER DATABASE `db_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

3. 資料表級 — 轉換現有表結構與資料

-- 僅修改表預設字元集 (不轉換現有欄位資料)
ALTER TABLE `tbl_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 【關鍵】完整轉換:結構 + 現有資料重新編碼
ALTER TABLE `tbl_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

⚠️ 必先備份! CONVERT TO 會重寫全表資料,大表耗時長、鎖表久。

4. 欄位級 — 精準修正單一欄位

ALTER TABLE `tbl_name`
MODIFY `col_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

三、連線層級 — 應用端必做

-- 連線建立後立即執行
SET NAMES utf8mb4;
-- 等同於
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

JDBC URL 範例:jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false

四、常見亂碼場景對照表

現象原因解決
插入中文變 ??? / 連線字元集非 utf8mb4 (如 latin1)應用啟動執行 SET NAMES utf8mb4
查詢結果顯示亂碼character_set_results 錯誤同上,或 JDBC 加 characterEncoding
LIKE '%中文%' 查不到連線/資料庫字元集不一致統一全鏈路 utf8mb4
Emoji 儲存截斷/報錯使用 utf8 (僅 3 bytes) 而非 utf8mb4 (4 bytes)全鏈路升級 utf8mb4
舊資料已是 latin1 存中文雙重編碼 (latin1 → utf8mb4 解碼錯誤)CONVERT TO 或程式讀出再寫入

五、驗證清單

  1. SHOW CREATE TABLE tbl_name 確認 CHARSET=utf8mb4
  2. SELECT HEX(col), col FROM tbl WHERE col LIKE '%中文%' 檢查位元模式
  3. 應用端寫入/讀出 Emoji 😀 驗證 4-byte 支援
  4. 備份檔 head -c 500 backup.sql | file - 確認 UTF-8 編碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved