字符集不匹配導致中文亂碼是經典坑。本文梳理從庫級到表級、列級的完整修改流程。
SHOW VARIABLES LIKE 'character%';
重點關注:character_set_database、character_set_server、character_set_client/connection/results。
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 僅修改表預設字符集(不轉換現有列數據)
ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 連同所有字符列一起轉換(推薦)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
CONVERT TO 會重建表,將所有
CHAR/VARCHAR/TEXT列按新字符集重新編碼,耗時與表大小成正比,大表請低峰期操作。
ALTER TABLE tbl_name MODIFY col_name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET NAMES utf8' # 讓連接默認用 utf8
重啟 MySQL 生效。
應用連接串或代碼中顯式設定:
?characterEncoding=utf8&useSSL=falsecharset=utf8 DSN 參數charset='utf8'utf8mb4 支援 Emoji/生僻字,utf8 實為 utf8mb3。CONVERT TO 若中斷可能損壞數據。SET NAMES latin1 覆蓋配置。