首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 插入中文報錯 "Incorrect string value" 徹底解決

     編輯:MySQL 資料庫相關知識

錯誤現象

ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column 'name' at row 1

十六進制 \xD6\xD0\xCE\xC4 對應 GBK 編碼的「測試」二字,說明客戶端傳入 GBK,但目標列字符集無法存儲。

根因:字符集不匹配鏈路

  1. 數據庫/表/列字符集為 latin1(單字節),無法存儲多字節中文
  2. 或連接層 SET NAMES 未設置,導致編碼轉換錯誤

標準修復三步走

1. 修正實例/庫/表/列字符集為 utf8mb4

-- 配置文件 /etc/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

重啟後,新建庫表自動繼承 utf8mb4。

2. 存量表轉換

-- 單表轉換(鎖表,大表慎用)
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

3. 連接層強制指定編碼

語言/驅動正確設置方式
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'})
命令行 mysqlmysql --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;

避坑指南

  1. utf8 ≠ utf8mb4:utf8 最大 3 字節,不支持 Emoji/生僻字,全鏈路必須 utf8mb4
  2. 配置文件陷阱:5.7+ 禁用 default-character-set 參數,必須用 character-set-server
  3. 連接池複用:應用重啟前連接池仍持有舊編碼連接,修改配置後必須重啟應用
  4. 備份還原:mysqldump --default-character-set=utf8mb4 導出,導入前確認目標庫 utf8mb4

核心口訣:實例 utf8mb4 → 表 utf8mb4 → 連接 utf8mb4 → 應用重啟,四步到位,徹底告別 1366 錯誤與中文亂碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved