91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

10分鐘完成MySQL對emoji的支持

發布時間:2020-06-26 01:57:53 來源:網絡 閱讀:86299 作者:dbapower 欄目:數據庫


公司有新要求,ios客戶端要上線評論中可以使用emoji表情的功能,mysql 5.5 之前,UTF-8編碼只支持1-3個字節;從MySQL 5.5開始,可以支持4個字節UTF編碼 utf8mb4 ,一個字符能夠支持更多的字符集,也能夠支持更多表情符號。


utf8mb4兼容utf8,且比utf8能表示更多的字符,是utf8字符集的超集。所以現在一些新的業務,比如IOS中的emoji表情,會將MySQL數據庫的字符集設置為utf8mb4。



先看問題:

Caused by: java.sql.SQLException: Incorrect string value: '\xF6\x9D\x98\x84' for column 'comment' at row 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)


如果我們將列comment設置為varchar(100),用于存儲評論信息,現在上線新功能存儲emoji表情,插入emoji表情就會報出上述錯誤,UTF-8編碼有可能是兩個、三個、四個字節。Emoji表情是4個字節,而Mysql的utf8編碼最多3個字節,所以數據插不進去。utf8mb4兼容utf8,且比utf8能表示更多的字符。

解決方案:將Mysql的編碼從utf8轉換成utf8mb4。



網上的文章各執一詞,本文就生產環境中真實可用的參數進行記錄


整體操作流程其實并不難



一:首先我們修改my.cnf參數

[client]
default-character-set=utf8mb4
  
  
[mysql]
default-character-set=utf8mb4
  
  
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
character-set-client-handshake = false

 


二:對數據庫相關的表進行字符集修改

將數據庫轉換為utf8mb4

mysql> ALTER DATABASE erp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


將已經建好的表也轉換成utf8mb4 

mysql>ALTER TABLE `erp_comment` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

將需要使用emoji的字段設置類型為: 

mysql>ALTER TABLE `erp_comment` MODIFY COLUMN `comment`  varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


三:重啟數據庫服務器使之生效

[root@HE3 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.... SUCCESS!

四:登錄數據庫檢查是否如下:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client    | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database  | utf8mb4            |
| character_set_filesystem | binary            |
| character_set_results    | utf8mb4            |
| character_set_server    | utf8mb4            |
| character_set_system    | utf8              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+--------------------------+--------------------+
rows in set (0.00 sec)

特別說明下:collation_connection/collation_database/collation_server如果是utf8mb4_general_ci,沒有關系。但必須保證character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server為utf8mb4。


五:讓開發那邊的pom配置中,去掉characterEncoding參數,并重新編譯一下

如果你用的是java服務器,升級或確保你的mysql connector版本高于5.1.13,否則仍然無法使用utf8mb4


最后再讓前端應用插入emoji表情,就可以了。





一些小知識點:

其中character-set-server 和 collation-server 這些設置為utf8mb4字符集是比較容易理解的,就是將MySQL數據庫相關的字符集都設置為utf8mb4;

但為了實現客戶端utf8連接到MySQL后,使用的也是utf8mb4字符集,就在 mysqld配置中配置了 init_connect='SET NAMES utf8mb4' 表示初始化連接都設置為utf8mb4字符集,再配置一個 skip-character-set-client-handshake = true 忽略客戶端字符集設置,不論客戶端是何種字符集,都按照init_connect中的設置進行使用,這樣就滿足了應用的需求。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太仓市| 夹江县| 武冈市| 鞍山市| 天峨县| 宣化县| 离岛区| 西乌珠穆沁旗| 乐山市| 资中县| 高要市| 确山县| 乐陵市| 永济市| 沁源县| 磐安县| 苗栗市| 奉贤区| 玉树县| 友谊县| 金堂县| 门头沟区| 万年县| 乌什县| 天长市| 上思县| 阳山县| 通海县| 阳西县| 佛山市| 新安县| 沭阳县| 宁海县| 娄烦县| 清河县| 古浪县| 马龙县| 河池市| 阳高县| 广宗县| 汤阴县|