MySQL 涉及四層字符集設置,任意一層不匹配即產生亂碼:
character_set_servercharacter_set_databasecharacter_set_client / column_charsetcharacter_set_connection、character_set_results[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4
關鍵點:
my.ini 通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server X.Y\CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 庫級轉換(僅影響後續建表) ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 表級轉換(含數據重寫,大表慎用) ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 僅修改表默認字符集(不轉換現有列) ALTER TABLE users DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 單列轉換 ALTER TABLE users MODIFY name VARCHAR(50) 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;
client:客戶端發送 SQL 的編碼connection:服務端解析 SQL 時的編碼results:結果集返回給客戶端的編碼最佳實踐:連接建立後立即執行 SET NAMES utf8mb4,或在連接串指定:
JDBC: ?useUnicode=true&characterEncoding=utf8mb4
PHP PDO: charset=utf8mb4
Python: charset='utf8mb4'
| 數據文件編碼 | 設置 | 導入命令 |
|---|---|---|
| UTF-8 | SET NAMES utf8mb4 | LOAD DATA INFILE 'utf8.txt' INTO TABLE t CHARACTER SET utf8mb4; |
| GBK/ANSI | SET NAMES gbk | LOAD DATA INFILE 'gbk.txt' INTO TABLE t CHARACTER SET gbk; |
鐵律:文件編碼、SET NAMES、目標表字符集三者必須完全一致。Windows CMD 不支持 UTF-8 顯示,導入驗證請用工具查看。
<meta charset="utf-8">(瀏覽器識別為 utf-8 即涵蓋 utf8mb4)useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNullmysqli_set_charset($link, 'utf8mb4')charset='utf8mb4' 參數charset: 'utf8mb4'-- 1. 查看當前會話字符集
SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
-- 2. 查看庫/表/列實際字符集
SHOW CREATE DATABASE mydb;
SHOW CREATE TABLE users;
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='mydb' AND TABLE_NAME='users';
-- 3. 驗證寫入讀取
INSERT INTO users(name) VALUES('測試😀');
SELECT name, HEX(name) FROM users WHERE name LIKE '%測試%';
若 HEX 顯示 E6B58BE8AF95F09F9880 (UTF-8 編碼) 則全鏈路正確。