java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'name' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)
當報以上錯誤的時候,可能是java代碼中的字段與數據庫中的字段類型或者編碼不匹配,這種情況只要統一格式或者編碼就可以了。
這裡主要介紹emoji的圖像插入資料庫的錯誤以及解決方法
使用mysql數據庫的時候,如果字符集是UTF-8並且在java伺服器上,當存儲emoji表情的時候,會拋出以上異常(例如微信開發獲取用戶暱稱,有的用戶的暱稱用的是emoji的圖像)
這是由於字符集不支持的異常,因為utf-8編碼有可能是兩個,三個,四個字節,其中Emoji表情是四個字節,而mysql的utf-8編碼最多三個字節,所以導致資料插不進去。
解決方式:
一.從資料庫層級解決(mysql支援utf8mb4的版本是5.5.3+,必須升級到較新版本)
注意:
(1.修改database,table,column字元集
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
還是無法試用utf8mb4
(4.伺服器端的db設定檔
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4'
而
autoReconnection(當資料庫連線異常中斷時,是否自動重新連線?預設為false)強烈建議配上,忽略這個屬性,可能導致快取緣故,
沒有讀取到DB最新的配置,導致一直無法試用utf8mb4字元集;
二.從應用層的面向解決
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE jdbc.username=root jdbc.password=password
URLEncoder.encode(nickName, "utf-8");
從應用層進行解決的時候建議不要在對象getter,setter方法中直接編碼,因為放入對象的時候setter方法將nickname進行編碼,當插入數據庫的時候相當於從對像中調用getter方法將你參考取出這就將之前setter編碼過的nickname又重新解碼了,等於未對Nickname進行任何操作。關注PHP中文網!