MySQL報錯:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1


1、插入MySQL表時,報錯:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

錯誤原因:參數中帶有emoji表情,插入數據庫時,一些特殊字符如“繁星拜月🌙”,插入報異常

解決思路:因為字符編碼集為utf8,不支持一些basic multilingual plane和補充字符,那么如何讓mysql存儲emoji表情,所以需要改成utf8mb4.

2、首先確保mysql的版本不能太低:需要mysql 5.5+,select version();

下面是小編的mysql數據庫的版本號

 3、查看數據庫編碼show variables like '%char%';

改成utf8mb4  命令語句是set character_set_server=utf8mb4

4. 將已經建好的表也轉換成utf8mb4 
  命令1:ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; (將TABLE_NAME替換成你的表名) 4. 將需要使用emoji的字段設置類型為: 

  命令2:ALTER TABLE `TABLE_NAME`MODIFY COLUMN `COLUMN_NAME`  text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

  總結就是將服務編碼 表編碼  字段編碼  統統改成 utf8mb4

5、但執行第4步命令1,生產又報錯:Specified key was too long; max key length is 767 bytes

原因:系統變量innodb_large_prefix開啟了,則對於使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引鍵前綴限制為3072字節。如果禁用innodb_large_prefix,不管是什么表,索引鍵前綴限制為767字節。

       上述的bug很明顯是索引超出了限制的長度767(公司項目生產上innodb_large_prefix禁用了):

       我發現報錯的那張表建立了一個varchar類型的索引,字段【OBJ_ID】varchar(255)  是索引列,覺得沒什么問題,其實不然,上述的767是字節,而varchar類型是字符,同時我發現我使用的字符集為(utf8mb4),這個指每個字符最大的字節數為4,所以很明顯 4*255 > 767

所以就報上述錯了(Specified key was too long; max key length is 767 bytes)。

       解決方法:1、改變varchar的字符數,我改成了字段【OBJ_ID】varchar(100) 就可以了, 100*4 <767;2、或者啟用innodb_large_prefix,那么限制值會增加到3072;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM