java mysql utf8編碼問題Incorrect string value:

最近遇到mysql數(shù)據(jù)存儲(chǔ)時(shí)報(bào)錯(cuò)

uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x98\x81",...' for column 'request_data' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x81",...' for column 'request_data' at row 1

創(chuàng)建數(shù)據(jù)庫和表時(shí)采用的字符集編碼為utf8, 存儲(chǔ)emoji表情時(shí)會(huì)產(chǎn)生以上錯(cuò)誤。
需要將utf8變?yōu)閡tf8mb4。關(guān)于兩者編碼的區(qū)別,參見utf8和utf8mb4區(qū)別mysql uft8mb4與emoji表情

網(wǎng)上的解決辦法大多是修改my.cnf參數(shù),設(shè)置mysql的編碼為utf8mb4,這種方法雖然徹底,但是通常要重啟mysql,會(huì)造成生產(chǎn)系統(tǒng)臨時(shí)當(dāng)機(jī)。
下面是影響相對(duì)更小的處理方法:

前提:mysql的版本不能太低,低于5.5.3的版本不支持utf8mb4編碼。

將表中的對(duì)應(yīng)字段,比如會(huì)員表的呢稱字段,其字符集修改成utf8mb4。

然后在java客戶端,將mysql-connector-java升級(jí)成最新版(目前最新版是5.1.37),最后修改druid數(shù)據(jù)源的配置,增加一行:
<property name="connectionInitSqls" value="set names utf8mb4;"/>
基本上應(yīng)該就可以了,如果還不行,檢查下jdbc連接串的設(shè)置:

jdbc:mysql://localhost:3306/db名稱?useUnicode=true&characterEncoding=utf8

再不行的話,把最后的?useUnicode=true&characterEncoding=utf8 去掉

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容