最近遇到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 去掉