首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 更新中文欄位報錯 1366 Incorrect string value 徹底解決:四層編碼統一

     編輯:MySQL 綜合教學

MySQL 錯誤 1366 Incorrect string value 徹底解決:Schema/Table/Column/Connection 四層編碼統一

執行 UPDATE 或 INSERT 中文時拋出 1366 Incorrect string value: '\xE8\x82\x96\xE5\xB1\xB1...' for column 'xxx',意味著**該欄位編碼無法容納輸入的字元位元組序列**。本文提供四層檢查清單與一鍵修復腳本。

錯誤根因分析

  • 錯誤位元組 \xE8\x82\x96\xE5\xB1\xB1 = UTF-8 編碼的「肝山」
  • 目標欄位編碼為 latin1 或 gbk,無法儲存該 UTF-8 字元
  • 或連線編碼宣稱 latin1,導致伺服端誤判輸入編碼

四層編碼檢查與修正 (由外而內)

1. 資料庫 Schema 編碼

-- 檢查
SHOW CREATE DATABASE db_name;
-- 修正
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

2. 資料表編碼

-- 檢查
SHOW CREATE TABLE tbl_name;
-- 修正 (僅影響新建欄位)
ALTER TABLE tbl_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 連帶修正現有欄位
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 欄位編碼 (最關鍵)

-- 檢查
SHOW FULL COLUMNS FROM tbl_name;
-- 修正單一欄位
ALTER TABLE tbl_name MODIFY col_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 或使用 CONVERT TO 批次修正全表欄位

4. 連線編碼 (極易忽略,必須驗證)

-- 檢查當前連線
SHOW VARIABLES LIKE 'character_set_%';

-- JDBC 連線字串 (關鍵!)
jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull

-- PHP PDO
$dsn = "mysql:host=localhost;dbname=db;charset=utf8mb4";

-- Python PyMySQL
conn = pymysql.connect(charset='utf8mb4')

-- 通用會話級修正
SET NAMES utf8mb4;

一鍵修復腳本 (謹慎執行,先備份)

-- 1. 修正資料庫
ALTER DATABASE `your_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 2. 修正所有表 (含欄位轉換)
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_db'
INTO OUTFILE '/tmp/fix_charset.sql';

-- 3. 執行生成的 SQL
SOURCE /tmp/fix_charset.sql;

驗證修復

-- 測試插入中文
INSERT INTO test_tbl (col) VALUES ('測試肝山😀');
SELECT * FROM test_tbl;

常見殘留問題

現象原因解決
修正後仍報 1366連線字串未加 characterEncoding檢查應用配置、連線池屬性
歷史資料變亂碼原資料以錯誤編碼寫入 (雙重編碼)需程式碼層面清洗重寫,或接受遺失
Emoji 存入變 ????仍用 utf8 (utf8mb3)全鏈路升級 utf8mb4
核心口訣: **Schema/Table/Column/Connection 四層皆為 utf8mb4**,少一層皆可能 1366。連線字串 characterEncoding=utf8mb4 是「最後一公里」,最易漏、最關鍵。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved