全新安裝的 MySQL 啟動後,執行 STATUS 發現 Server characterset: latin1,導致中文資料儲存亂碼。預設字元集為 latin1 是舊版 MySQL 的遺留預設值,現代應用幾乎都需要 UTF-8(或 utf8mb4)。
/etc/init.d/mysql.server start --character-set-server=utf8
缺點:每次重啟都需手動加參數,不適合生產環境。
SET character_set_server=utf8;
缺點:僅影響當前連線,重新登入即恢復 latin1,因為伺服器啟動時已讀取配置檔。
編輯 /etc/my.cnf(或 /etc/mysql/my.cnf),在 [mysqld] 區塊新增:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
character-set-server=utf8mb4 # 建議使用 utf8mb4 完整支援 Emoji
collation-server=utf8mb4_unicode_ci
重啟服務:systemctl restart mysqld 或 service mysql restart。
mysql> STATUS;
...
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
...
伺服器端設定 character-set-server 只控制預設值。應用程式連線時仍建議顯式指定:
jdbc:mysql://host/db?characterEncoding=utf8mb4charset='utf8mb4'charset=utf8mb4 在 DSN 中utf8 僅支援 3 位元組字元(BMP 範圍),無法儲存 Emoji 與部份生僻字,**務必使用 utf8mb4**ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 轉換my.cnf 位置不固定:mysql --help | grep my.cnf 可查看實際讀取順序