java.sql.SQLException: Incorrect string value: '\xE7\xAE...' for column 'description' at row 1
Error Code: 1366
插入數據的編碼(如 UTF-8)與資料表欄位字符集(如 latin1)不一致。UTF-8 中文佔 3 字節,latin1 單字節只能存 1 字節,導致數據截斷、無法寫入。
SHOW CHARACTER SET; 關注 Maxlen 欄位SHOW FULL COLUMNS FROM table_name; 查看 Collation 欄位SHOW VARIABLES LIKE 'character_set_%';-- 修改資料庫預設字符集
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改表預設字符集(僅影響後續新增欄位)
ALTER TABLE tbl_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改現有欄位字符集(會轉換數據)
ALTER TABLE tbl_name MODIFY col_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 或一步到位轉換整表
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Windows (my.ini):
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Linux (my.cnf):
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
注意:MySQL 5.5+ 廢棄 default-character-set,必須用 character-set-server。修改後需重啟服務,且現有庫表需重建或轉換。
-- SQL
SET NAMES utf8mb4;
-- Java JDBC URL
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useSSL=false
-- Python MySQLdb
conn = MySQLdb.connect(charset='utf8mb4')
utf8mb4_general_ci 不分大小寫,_bin 按二進制比較)| 變數 | 作用 |
|---|---|
| character_set_server | 服務器內部操作預設字符集 |
| character_set_client | 客戶端發送數據的字符集 |
| character_set_connection | 連接層字符集(服務器將客戶端數據轉換為此字符集) |
| character_set_results | 查詢結果返回給客戶端的字符集 |
| character_set_database | 當前選中資料庫的預設字符集 |
| character_set_system | 系統元數據(欄位名等)字符集,固定 utf8 |
characterEncoding=utf8mb4latin1 存儲多語言數據