中文亂碼是 MySQL 開發者最常遇到的坑。本文提供 5 種解決方案,從臨時指定到永久配置,並總結字符集變數含義,助你建立統一 UTF-8 環境,徹底告別亂碼。
SET NAMES latin1mysql> SET NAMES latin1;
mysql> SOURCE test.sql;
適用於匯入舊版 latin1 編碼的 SQL 檔案。
-- test.sql 開頭加入
SET NAMES latin1;
INSERT ...
再執行 SOURCE test.sql; 或命令列導入。
mysql -uroot -p123456 test < test.sql
-- 前提:test.sql 內已有 SET NAMES latin1;
mysql -uroot -p123456 --default-character-set=latin1 test < test.sql
SQL 檔本身無需包含 SET NAMES。
[client]
default-character-set=utf8
[server] # MySQL 5.1 以前
default-character-set=utf8
[mysqld] # MySQL 5.5+
character-set-server=utf8
collation-server=utf8_general_ci
修改後無需重啟,重新登入即可生效。
CREATE DATABASE wyb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 程式連線亦需指定 charset=utf8(JDBC、PDO、mysqli 等)
| 變數 | 含義 | 建議值 |
|---|---|---|
| character_set_client | 客戶端發送語句的編碼 | utf8 |
| character_set_connection | 連線層轉換編碼 | utf8 |
| character_set_database | 預設資料庫編碼 | utf8 |
| character_set_results | 返回結果集編碼 | utf8 |
| character_set_server | 服務端預設編碼 | utf8 |