ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column 'name' at row 1
十六進制 \xD6\xD0\xCE\xC4 對應 GBK 編碼的「測試」二字,說明客戶端傳入 GBK,但目標列字符集無法存儲。
latin1(單字節),無法存儲多字節中文SET NAMES 未設置,導致編碼轉換錯誤-- 配置文件 /etc/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
重啟後,新建庫表自動繼承 utf8mb4。
-- 單表轉換(鎖表,大表慎用)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 大表在線轉換
pt-online-schema-change --alter "CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" \
D=db_name,t=tbl_name --execute --user=root --password=xxx
| 語言/驅動 | 正確設置方式 |
|---|---|
| PHP (mysqli) | mysqli_set_charset($link, 'utf8mb4'); |
| PHP (PDO) | new PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass); |
| Java (JDBC) | jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull |
| Python (PyMySQL) | pymysql.connect(charset='utf8mb4') |
| Go (go-sql-driver/mysql) | dsn := "user:pass@tcp(host:3306)/db?charset=utf8mb4&parseTime=True&loc=Local" |
| Node.js (mysql2) | createConnection({charset: 'utf8mb4'}) |
| 命令行 mysql | mysql --default-character-set=utf8mb4 或連接後 SET NAMES utf8mb4; |
-- 1. 檢查實例默認
SHOW VARIABLES LIKE 'character_set_server'; -- 應為 utf8mb4
-- 2. 檢查表/列
SHOW CREATE TABLE tbl_name; -- CHARSET=utf8mb4
-- 3. 檢查連接
SHOW VARIABLES LIKE 'character_set_%';
-- client/connection/results 應全為 utf8mb4
-- 4. 實測插入
INSERT INTO tbl_name(name) VALUES('測試😀');
SELECT * FROM tbl_name;
utf8 最大 3 字節,不支持 Emoji/生僻字,全鏈路必須 utf8mb4default-character-set 參數,必須用 character-set-servermysqldump --default-character-set=utf8mb4 導出,導入前確認目標庫 utf8mb4核心口訣:實例 utf8mb4 → 表 utf8mb4 → 連接 utf8mb4 → 應用重啟,四步到位,徹底告別 1366 錯誤與中文亂碼。