MySQL: Incorrect string value: '\xF0\xA4\xBD\x82'分析
一、問題由來
今天應用報錯:
### Error updating database. Cause: java.sql.SQLException:
Incorrect string value: '\xF0\xA4\x9E\x8F",...' for column 'message_content' at row 1
二、初次分析
我們可以看到\xF0\xA4\x9E\x8F是4位元組很可能就是utf8mb4中某些生僻字的編碼。我們將表更改為utf8mb4後還是報錯。所以第一步一定要將欄位或者表修改為utf8mb4如下語句
alter table test101 convert to character set utf8mb4; or alter table test101 change `name` `name` varchar(20) CHARSET utf8mb4 DEFAULT NULL ;
注意:這個語句是copy演算法會受到MDL LOCK的影響完全堵塞,不是online ddl如下:
mysql> alter table test204 algorithm=inplace, change `name` `name`
varchar(20) CHARSET utf8 DEFAULT NULL ;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
三、詳細分析
隨後當然報錯還在繼續,然後我簡單描述一下我的分析的過程。具體知識見如下文章:
關於ORACLE和MYSQL中文字元亂碼的根源剖析]
http://blog.itpub.net/7728585/viewspace-2086271/
我們當前環境為:
- 客戶端入庫字符集 utf8mb4
- 轉換字符集 utf8
- 儲存端字符集utf8mb4
對於這種情況的設定,對已某些生僻字比如:
insert into test204 values('????');
(????)的其utf8mb4編碼為:
就需要將四位元組的0Xf0a4bd82編碼轉換為utf8顯然是不可能的。因為utf8根本不認識而且還是三個位元組所以報錯如下:
[SQL] insert into test204 values('????');
[Err] 1366 - Incorrect string value: '\xF0\xA4\xBD\x82' for column 'name' at row 1
為此實際上我們只需要做一個操作就是不做轉換及
set names utf8mb4;
這樣環境如下:
- 客戶端入庫字符集 utf8mb4
- 轉換字符集 utf8mb4
- 儲存端字符集utf8mb4
insert into test204 values('????');
[SQL] insert into test204 values('????');
受影響的行: 1 時間: 0.218s
插入成功。我們讀取資料檔案二進位制進行底層驗證取到的資料如下:
紅色部分為('????')這個字的十六進位制編碼。沒有問題資料入庫完成。
作者微信:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2153150/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java.sql.SQLException: Incorrect string valueJavaSQLException
- 【BUG記錄】MySQL插入Emoji表情報錯"Incorrect string value"MySql
- 解決:java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94‘ for columnJavaSQLException
- mysql 報錯:ERROR 1366 (HY000): Incorrect string value: ‘\xD5\xC5\xC8\xFD‘ for column ‘name‘ at row 1MySqlError
- 【MySQL報錯】1366 - Incorrect string value: ‘\xE6\x80\xBB\xE7\xBB\x8F...‘ for column ‘name‘ at row 1MySql
- MySQL, Incorrect usage of UNION and ORDER BYMySql
- PHP連線SQL資料庫無法顯示emoji表情的解決辦法(變成問號、1366 Incorrect string value)PHPSQL資料庫
- 解決 Incorrect datetime value: '0000-00-00 00:00:00' 報錯
- StringRedisTemplate操作Redis時拋: Unexpected token (VALUE_STRING)Redis
- 【JDK】分析 String str=““ 與 new String()JDK
- Oracle分析函式-first_value()和last_value()Oracle函式AST
- Java原始碼閱讀-String中的private final char value[];Java原始碼
- String原始碼分析原始碼
- JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from StringJSONErrorJavaLDA
- 33.Java-String分析Java
- Java String原始碼分析Java原始碼
- mysql遇到Variable can’t be set to the value of ‘NULL’MySqlNull
- MySQL案例02:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGESMySqlError
- [20190728]分析函式LAST_VALUE.txt函式AST
- [Vue warn]: Invalid prop: type check failed for prop "unlinkPanels". Expected Boolean, got String with value "true".VueAIBooleanGo
- Java-- String原始碼分析Java原始碼
- SpringBoot升級到3.2.0報錯Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.StringSpring BootBeanObjectJava
- 計議近取構至切改者壓xbd
- Mysql:Variable 'XXXt' can't be set to the value of 'NULL'解決MySqlNull
- 位元組碼底層分析String
- MySQL執行語句報Incorrect key file for table '/tmp/#sql_.MYI'; try to repair itMySqlAI
- vue報錯:[Vue warn]: Invalid prop: type check failed for prop "value". Expected Number, got String....VueAIGo
- 查LOB文字內容報錯ORA-06502: numeric or value error: character string buffer..Error
- Java更新資料庫報錯:Data truncation: Cannot create a JSON value from a string with CHARACTER SETJava資料庫JSON
- java基礎:String — 原始碼分析(一)Java原始碼
- Java String的相關性質分析Java
- Java基礎類String學習分析Java
- java.sql.SQLException: No value specified for parameter 1 異常分析JavaSQLException
- SQLSTATE [22007]: Invalid datetime format: 1292 IncorrectSQLORM
- Java之String和StringBuffer堆疊圖分析Java
- mysql-timestamp 0000-00-00 00:00:00 Invalid default valueMySql
- CF708D Incorrect Flow 題解
- golang multiple-value xxx in single-value contextGolangContext