mysql保存emoji表情(微信開髮用戶暱稱..)

高洛峰
發布: 2017-02-15 10:47:28
原創
2405 人瀏覽過

 

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字元集

      (2.修改mysql設定檔my.cnf(window為my.ini)


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中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!