中文存入資料庫變「???」或亂碼,根因通常是客戶端、連線、伺服器、表/列四層字符集不一致。
/etc/my.cnf)[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' skip-character-set-client-handshake
關鍵點:
skip-character-set-client-handshake 強制忽略客戶端聲明的字符集,統一由伺服器指定,避免驅動程式行為差異。init_connect 確保非超級用戶連線自動執行 SET NAMES utf8mb4。mysql> SHOW VARIABLES LIKE 'character_set%'; +--------------------------+----------------------------+ | 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_set_filesystem | binary | +--------------------------+----------------------------+

所有 character_set_* 均為 utf8mb4 即成功(character_set_system 固定為 utf8 屬正常)。
(HTML5 標準即 utf8mb4 兼容)。