讓Mysql支援Emoji表情
阿新 • • 發佈:2019-02-02
最近在做一個iPhone上的專案,我負責後端,Java開發,DB用的是Mysql,版本5.5.21,編碼用的是UTF-8。
但發現了一個問題,iPhone上有Emoji表情,插入Mysql時失敗了,報如下異常:
Java程式碼- java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94'for column '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)
上百度Google一下,終於找到了答案。UTF-8編碼有可能是兩個、三個、四個位元組。Emoji表情是4個位元組,而Mysql的utf8編碼最多3個位元組,所以資料插不進去。解決方案就是:將Mysql的編碼從utf8轉換成utf8mb4。網上應該能搜到一大堆修改Mysql編碼的方法。
我是這麼做的,可能有些修改沒有必要,但最終我還是解決了問題:
1. 修改my.cnf
[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4
修改後重啟Mysql
2. 以root身份登入Mysql,修改環境變數,將character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server 都修改成utf8mb4
3. 將已經建好的表也轉換成utf8mb4
命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (將TABLE_NAME替換成你的表名)
至此,OK了!