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/29734436/viewspace-2153291/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【MySQL】Incorrect string value 問題一則MySql
- 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:''for column''at row 1解決方案MySqlError
- MySQL 亂碼實戰解決ERROR 1366 (HY000): Incorrect string value: 'MySqlError
- ORACLE匯出文字到MYSQL 報錯 Incorrect integer value: ''OracleMySql
- Mybatis Data truncation: Truncated incorrect DOUBLE value: '*'MyBatis
- kettle建立資源庫Incorrect integer value
- 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資料庫
- MySQL-修改表的編碼和列的編碼-Incorrect string value: '\xE6\xB1\x9F\xE5\xAE\x81...' for column 'unitname' at rowMySql
- 解決 Incorrect datetime value: '0000-00-00 00:00:00' 報錯
- MYSQL寫入資料時報錯ERROR 1366 (HY000): Incorrect string value: '\xE8\x8B\xB1\xE5\xAF\xB8...' for c 插入中文不能插...MySqlError
- mysql出現Unknown or incorrect time zone: 'NULL'MySqlNull
- 分析函式——FIRST_VALUE()和LAST_VALUE()函式AST
- android 獲取string.xml中的valueAndroidXML
- com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLEMySqlJDBCLDA
- MySQL錯誤Incorrect file format解決方案薦MySqlORM
- Oracle分析函式-first_value()和last_value()Oracle函式AST
- 【JDK】分析 String str=““ 與 new String()JDK
- StringRedisTemplate操作Redis時拋: Unexpected token (VALUE_STRING)Redis
- String原始碼分析原始碼
- ERROR getting 'android:label' attribute: attribute is not a string valueErrorAndroid
- ORA-06502 PL/SQL: numeric or value error stringSQLError
- Java原始碼閱讀-String中的private final char value[];Java原始碼
- mysql遇到Variable can’t be set to the value of ‘NULL’MySqlNull
- Java String原始碼分析Java原始碼
- 33.Java-String分析Java
- JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from StringJSONErrorJavaLDA
- Could not resolve placeholder 'redis.pool.maxTotal' in string value "${redis.pool.maxTotal}"Redis
- [轉]分析函式 last_value的使用函式AST
- Java-- String原始碼分析Java原始碼
- MySQL 5.5 報錯"ERROR 1075 (42000): Incorrect table definition"MySqlError
- ERROR 1292 (22007): Truncated incorrect DOUBLE value 和ORA-01722: invalid numberError
- Error: Attribute application@label value=(@string/appname) from AndroidManifestErrorAPPAndroid