中文寫入變亂碼,90% 是字符集/排序規則不一致導致隱式轉換錯誤。核心原則:庫、表、列三級字符集與排序規則必須完全一致。本文提供一鍵檢查 SQL,快速定位不一致層級。
-- 1. 庫級別
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'YourDBName';
-- 2. 表級別
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'YourDBName';
-- 3. 列級別
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'YourDBName'
AND DATA_TYPE IN ('char','varchar','text','enum','set');
ALTER TABLE ... MODIFY COLUMN 修改列類型時未帶 CHARACTER SET,導致該列編碼與表其他列不同。INSERT ... SELECT 時,源庫 utf8mb4、目標庫 latin1,隱式轉換丟失字符。DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci(或 8.0+ utf8mb4_0900_ai_ci)。ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 遞歸轉換表及所有列。charset=utf8mb4,避免會話級 character_set_client 為 latin1。