在 Amazon RDS for MySQL 中存儲中文字符時,若配置不當會導致數據顯示為 ????。本文提供從參數組修改到數據庫/表級字符集調整的完整解決方案。
雖然實例級參數已設為 utf8:
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+-------------------------------------------+
但寫入中文仍顯示亂碼,原因在於現有數據庫與表的字符集定義未同步更新。
使用 MySQL 客戶端連接 RDS 端點(需先在安全組入站規則添加當前 IP):
mysql -u USERNAME -pPASSWORD -h ENDPOINT DATABASENAME
注意:-p 與密碼之間無空格;ENDPOINT 為控制台顯示的終端節點(不含端口)。
ALTER DATABASE `DATABASENAME` CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `TABLENAME` CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `TABLENAME` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
關鍵區別:
CHARACTER SET 僅修改表默認字符集,影響後續新建列/數據CONVERT TO 會重建表並轉換現有數據編碼,必須執行此步驟 修復已存儲的亂碼若表較多,可生成批量 SQL:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DATABASENAME';
將輸出結果複製執行即可完成全庫轉換。
INSERT INTO test_chinese (col) VALUES ('測試中文');
SELECT * FROM test_chinese;
若正常顯示中文,配置生效。建議同步檢查應用端連接字符串是否包含 characterEncoding=utf8 參數。
utf8mb4 完整支援 Emoji 等 4 字節字符SET GLOBAL 即時生效CharacterSetName: utf8