連線進 MySQL,SELECT * FROM my_table 顯示亂碼(、???、ber 等),資料實際儲存正確,僅是客戶端與伺服器字符集不一致。
SET character_set_client = charset; SET character_set_connection = charset; SET character_set_results = charset;
client:客戶端發送 SQL 的編碼connection:伺服器解析 SQL 的編碼results:伺服器回傳結果的編碼CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
| 現象 | 原因 | 對策 |
|---|---|---|
| 存入「😀」變 ?? | utf8 只支援 3 字節,emoji 需 4 字節 | 全鏈路用 utf8mb4 |
| SET NAMES utf8 後仍亂碼 | 表/欄位定義是 latin1/gbk,資料已錯誤編碼入庫 | ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 重建 |
| JDBC 連線亂碼 | 連線字串未指定 characterEncoding | jdbc:mysql://host/db?characterEncoding=utf8&useSSL=false |
| Python pymysql 亂碼 | 未傳 charset 參數 | pymysql.connect(charset='utf8mb4') |