線上業務抓取微博數據入庫時,頻繁拋出 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xAA'... 異常,導致數據寫入失敗。本文深度解析字符集編碼根因,給出生產環境平滑遷移至 utf8mb4 的完整方案。
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xAA' for column 'raw_json' at row 1 org.springframework.jdbc.UncategorizedSQLException: ...
raw_json 字段包含 Emoji 字符(如 💪),十六進制 \xF0\x9F\x92\xAA 佔用 4 字節。
utf8(實為 utf8mb3)最多僅支持 3 字節字符,覆蓋基本多文種平面(BMP)。utf8 範圍,導致寫入截斷報錯。utf8mb4(mb4 = most bytes 4)。原則:先測試環境驗證,避開業務高峰,申請停機窗口操作。
編輯 my.cnf(或 my.ini),[mysqld] 區塊新增/修改:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4
重啟 MySQL 服務生效。
pt-online-schema-change 或 gh-ost 在線變更。步驟 3:驗證應用端連線配置
?characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ciSET NAMES utf8mb4。測試環境模擬寫入含 Emoji 的 JSON、文本,確認無異常;檢查讀取、檢索、備份還原流程正常。
utf8。utf8mb4 單字符 4 字節,InnoDB 單列索引長度上限 767 字節(MySQL 5.7+ / 開啟 innodb_large_prefix 可提升至 3072),設計 VARCHAR 長度時預留餘量(如 VARCHAR(191))。utf8mb4_unicode_ci 基於 UCA 標準,準確性高;utf8mb4_general_ci 速度略快但對某些語言排序不準。推薦 unicode_ci。mysqldump 需加 --default-character-set=utf8mb4 參數,防止導出亂碼。完成上述遷移後,線上業務再寫入 Emoji 表情將不再報錯,徹底解決「Incorrect string value」難題。