| 參數 | 作用範圍 | 建議值 |
character_set_server | 服務端默認字符集 | utf8mb4 |
character_set_database | 當前數據庫默認 (信息_schema) | utf8mb4 (由CREATE DATABASE指定) |
character_set_client | 客戶端發送語句編碼 | utf8mb4 (連接層SET NAMES決定) |
character_set_connection | 連接層轉換目標編碼 | utf8mb4 |
character_set_results | 結果集返回編碼 | utf8mb4 |
character_set_system | 系統標識符編碼 (固定utf8) | utf8 (不可變) |
collation_server | 服務端默認校對規則 | utf8mb4_unicode_ci |
collation_database | 當前庫默認校對規則 | utf8mb4_unicode_ci |
collation_connection | 連接層校對規則 | utf8mb4_unicode_ci |
配置文件標準化 (my.cnf / my.ini)
Linux: /etc/my.cnf 或 /etc/mysql/my.cnf
Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
[mysqld]
# === 核心字符集配置 ===
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4' # 非SUPER權限用戶連接自動執行
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqldump]
default-character-set = utf8mb4
重啟驗證全參數
# 1. 重啟服務
systemctl restart mysqld # Linux
net stop MySQL80 && net start MySQL80 # Windows
# 2. 登錄驗證
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation_%';"
# 3. 期望輸出 (關鍵參數均為 utf8mb4)
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 | -- 系統固定,不可改
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
建表/建庫顯式指定 (不依賴繼承)
-- 數據庫
CREATE DATABASE biz_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 表 (標準範本)
CREATE TABLE users (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
nickname VARCHAR(50) COMMENT '暱稱(支持Emoji)',
profile JSON COMMENT '擴展屬性',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci
COMMENT='用戶核心表';
-- 修改現有表
ALTER TABLE legacy_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
連接層初始化代碼模式 (各語言)
-- PHP PDO (推薦)
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=biz_db;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
-- Java JDBC (8.0驅動)
url=jdbc:mysql://host:3306/biz_db?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
-- Python PyMySQL
conn = pymysql.connect(host='host', user='user', password='pass',
database='biz_db', charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
-- Go (go-sql-driver/mysql)
db, _ := sql.Open("mysql", "user:pass@tcp(host:3306)/biz_db?charset=utf8mb4&parseTime=True&loc=Local")
常見遺漏參數排查
| 現象 | 原因 | 檢查命令 | 修正 |
| client/connection/results 仍為 latin1 | 未執行 SET NAMES / 驅動未指定 charset | SHOW SESSION VARIABLES LIKE 'character_set_%'; | 應用層連接建立後立即執行 SET NAMES utf8mb4 或驅動 DSN 指定 charset |
| database 顯示 latin1 | 建庫未指定 CHARSET,繼承舊默認 | SHOW CREATE DATABASE db_name; | ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; (僅影響新表) |
| 表/列仍為 latin1 | 建表未指定,繼承庫默認 | SHOW CREATE TABLE tbl_name\G | ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
| 系統參數 system 仍為 utf8 | character_set_system 固定為 utf8 (utf8mb3),不可修改 | — | 正常現象,不影響業務數據存儲 |
Windows 特殊說明
- 配置文件
my.ini 修改後,必須以管理員身份重啟服務 生效
- 若有多個 my.ini (安裝目錄、ProgramData、Windows目錄),以
mysqld --help --verbose 2>nul | findstr /C:"Default options" 輸出的讀取順序為準,通常 ProgramData 優先級最高
- 命令行客戶端臨時指定:
mysql --default-character-set=utf8mb4 -u root -p
驗證腳本化 (納入巡檢)
#!/bin/bash
# check_charset.sh
mysql -u root -p${PWD} -e "
SELECT
@@character_set_server AS server_charset,
@@collation_server AS server_collation,
@@character_set_client AS client_charset,
@@character_set_connection AS conn_charset,
@@character_set_results AS result_charset,
@@character_set_database AS db_charset,
@@collation_database AS db_collation,
@@collation_connection AS conn_collation;
" | grep -vE 'utf8mb4|utf8mb4_unicode_ci|utf8' && echo "⚠️ 發現非UTF8MB4參數" || echo "✅ 所有字符集參數正確"
- 上一篇文章: MySQL主從同步配置實戰:GTID模式部署、故障處理與監控運維
- 下一篇文章: Linux下MySQL源碼編譯安裝啟用中文支持:GBK/UTF-8雙模構建指南
Copyright ©
程式碼之家 All Rights Reserved