MySQL 預設 latin1` 不支援中文,必須調整為 utf8 或 utf8mb4。本文涵蓋:查看當前編碼、Linux/Windows 修改預設編碼、JDBC 連接字串指定編碼、會話級 SET NAMES 臨時修改、資料庫/表/欄位級獨立指定編碼六大場景。
SHOW VARIABLES LIKE 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
character_set_client:客戶端發送 SQL 的編碼character_set_connection:連接層轉換編碼character_set_database:預設資料庫編碼character_set_results:結果集返回編碼character_set_server:服務端預設編碼**只要上述 4 個 (client/connection/results/server) 一致,即不會亂碼。**
service mysql stop/etc/my.cnf (或 /etc/mysql/my.cnf):[client] default-character-set=utf8 [mysqld] default-character-set=utf8 character-set-server=utf8 init_connect='SET NAMES utf8' collation-server=utf8_general_ci
service mysql startSHOW VARIABLES LIKE 'character%'; 應全為 utf8。使用 MySQL Server Instance Config Wizard 逐步勾選 UTF-8,避免手改 my.ini 遺漏區塊導致 1067 錯誤。
-- 建庫指定 CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE IF NOT EXISTS db_name DEFAULT CHARACTER SET utf8; -- 建表指定 CREATE TABLE t (c VARCHAR(50)) CHARSET=utf8; -- 修改既有表 ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 欄位級指定 ALTER TABLE t MODIFY c VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin;
jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf-8 # 注意:參數間**不可有空格**,否則報錯
SET NAMES utf8; -- 等同於同時設定 client/connection/results 三個變數 SET NAMES gbk; -- 針對舊系統相容
**限制**:僅對**當前連線**生效,斷線失效;不改變資料儲存編碼(寫入仍按表/庫定義編碼存儲)。
SHOW VARIABLES LIKE 'character%'; -- 執行 SET NAMES utf8 前後對比,client/connection/results 變為 utf8 -- database/server 維持原值
my.cnf 統一設定 utf8mb4,資料庫/表預設繼承。ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 逐表轉換,配合應用層連接字串 characterEncoding=utf-8。SET NAMES utf8mb4(或依賴驅動 characterEncoding 參數)。utf8 實為 utf8mb3,**不支援 Emoji**,生產環境**強制使用 utf8mb4**。