字符編碼問題是 MySQL 開發與維護中常見的棘手挑戰。亂碼、插入失敗、查詢異常往往源於編碼不一致。本文系統梳理 MySQL 字符編碼的查看方法,並詳細說明從配置文件、庫、表到欄位層級的多種修改路徑,助你徹底解決編碼困擾。
執行以下命令,即可獲取所有與字符集相關的系統變數:
SHOW VARIABLES LIKE 'character_set%';
重點關注 character_set_server(服務端)、character_set_database(當前庫)、character_set_client(客戶端)、character_set_connection(連接層)以及 character_set_results(結果集)這五個核心變數。確保它們均為 utf8 或 utf8mb4,是避免亂碼的基礎。
根據作業系統編輯對應配置文件:
my.ini/etc/my.cnf 或 /etc/mysql/my.cnf在 [mysqld]、[mysql]、[client] 等區塊中添加或修改以下參數(推薦使用 utf8mb4 以支援 Emoji 等 4 字節字符):
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [mysql] default-character-set=utf8mb4 [client] default-character-set=utf8mb4
注意:修改後必須重啟 MySQL 服務才能生效(systemctl restart mysqld 或服務管理器重啟)。
CREATE DATABASE `db_name` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER DATABASE `db_name` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
說明:庫級別修改僅影響後續新建的表,不會自動轉換已存在表的編碼。
CREATE TABLE `tbl_name` ( `id` INT PRIMARY KEY ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
ALTER TABLE `tbl_name` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
同理,此操作僅對新增欄位生效,現有欄位需單獨轉換。
對於已有數據的表,需逐欄位執行 MODIFY 或 CHANGE 並指定 CHARACTER SET:
ALTER TABLE `tbl_name` MODIFY `col_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
或使用 CONVERT TO 一鍵轉換整表所有字符欄位:
ALTER TABLE `tbl_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
避坑指南:執行轉換前務必備份數據;大表操作會鎖表,建議低峰期執行或使用 pt-online-schema-change 等工具。
即使服務端配置完美,若 JDBC/ODBC/連接池未指定 characterEncoding=utf8mb4,仍會出現亂碼。典型連接串範例:
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai
utf8mb4 + utf8mb4_general_ci(或 utf8mb4_0900_ai_ci)。CONVERT TO 逐表轉換,解決「存量」問題。SHOW VARIABLES LIKE 'character_set%'; 巡檢,防止配置漂移。掌握上述層級操作,即可從容應對 MySQL 字符編碼的各種場景,讓數據存儲與交互「零亂碼」。