中文亂碼源於「字符集不一致」。本文記錄從 SET NAMES 臨時失效、SET character_set_xxx 重啟失效,到修改 my.cnf 永久生效、建表指定 CHARSET 終極驗證的完整排查過程。
SET NAMES utf8;:僅影響當前 Session,斷線失效。SHOW VARIABLES LIKE '%character%'; 發現 character_set_database 與 character_set_server 為 latin1。SET character_set_database=utf8;:重啟後還原。sudo /etc/init.d/mysql stop
# 或 systemctl stop mysql
sudo vim /etc/mysql/my.cnf
在 [mysqld] 區塊新增(行尾嚴禁多餘空格):
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
sudo /etc/init.d/mysql start
mysql> SHOW VARIABLES LIKE '%character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_server | utf8 |
| character_set_database | utf8 |
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_results | utf8 |
| ... | ... |
+--------------------------+----------------------------+
即使 Server 層已是 UTF-8,CREATE TABLE t (...) ENGINE=InnoDB; 預設仍可能繼承舊庫的 latin1。必須:
CREATE TABLE t (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
或修改庫預設:ALTER DATABASE db_name CHARACTER SET utf8;
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
ALTER ... CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;characterEncoding=utf8mb4(Connector/J 5.1.13+)。| 操作 | 生效範圍 | 持久性 |
|---|---|---|
| SET NAMES utf8 | 當前 Session | 斷線失效 |
| SET GLOBAL character_set_xxx | 全域(新連線) | 重啟失效 |
| my.cnf [mysqld] 區塊設定 | 全域永久 | 永久生效 |
| CREATE TABLE ... DEFAULT CHARSET=utf8 | 該表 | 永久(除非 ALTER) |