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;