亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL插入emoji表情失敗問題的解決方法

2024-07-24 13:13:13
字體:
來源:轉載
供稿:網友

前言

之前一直認為UTF-8是萬能的字符集問題解決方案,直到最近遇到這個問題。最近在做新浪微博的爬蟲, 在存庫的時候發現只要保持emoji表情,就回拋出以下異常:

Incorrect string value: '/xF0/x90/x8D/x83/xF0/x90...'

眾所周知UTF-8是3個字節, 其中已經包括我們日常能見過的絕大多數字體. 但3個字節遠遠不夠容納所有的文字, 所以便有了utf8mb4, utf8mb4是utf8的超集, 占4個字節, 向下兼容utf8. 我們日常用的emoji表情就是4個字節了.

所以在此我們像utf8的數據表插入數據就會報出Incorrect string value這個錯誤.

Google一下很容易就找到了解決方案, 具體解決辦法是如下:

一、修改數據表的字符集為utf8mb4

這點很簡單, 修改語句網上找一大堆, 不過建議重新建表, 使用 mysqldump -uusername -ppassword database_name table_name > table.sql 備份相應數據表, 并修改其中的建表語句的字符集為 utf8mb4 即可, 然后 mysql -uusername -ppassword database_name < table.sql 重新導入sql即可完成修改字符集操作.

二、MySQL數據庫版本要5.5.3及以上

網絡上所有的文章都說明要MySQL 5.5.3以上的版本才支持utf8mb4, 不過我使用的數據庫版本為5.5.18, 最終仍能解決問題, 所以同學們不要急著找運維哥哥升級數據庫先, 先試試能不能自己解決問題.

三、修改數據庫配置文件/etc/my.cnf并重啟mysql服務

主要是修改數據庫的默認字符集, 以及連接, 查詢的字符集, [Mysql支持emoji 表情符號 升級編碼為UTF8MB4][1] 這篇文章有詳細的設置方法, [深入Mysql字符集設置][2] 這篇文章有其中設置的各個字符集的作用, 大家可以科普下.

四、升級MySQL Connector到5.1.21及以上

以上所有的操作, 最關鍵的是步驟3, 修改數據庫的配置文件, 其中大概修改了

[client]# 客戶端來源數據的默認字符集default-character-set = utf8mb4[mysqld]# 服務端默認字符集character-set-server=utf8mb4# 連接層默認字符集collation-server=utf8mb4_unicode_ci[mysql]# 數據庫默認字符集default-character-set = utf8mb4

這些配置指定了數據從客戶端到服務端所經過的一條條管道使用的字符集, 其中每一個管道出現問題都可能會導致插入失敗或者亂碼.

但很多時候, 線上的數據庫是不能隨便修改數據庫文件的, 所以我們的運維同學很果斷的回絕了我修改數據庫配置文件的請求(T_T)

所以就只能用代碼解決了, 一開始是準備從JDBC連接時候就指定使用的字符集處下手.

jdbc:mysql://localhost:3306/ding?characterEncoding=UTF-8

主要把UTF-8修改為utf8mb4對于的Java Style Charset字符串應該就能解決問題吧?

不過很遺憾的是, Java JDBC并不存在utf8mb4對于的字符集. 使用UTF-8的時候可以兼容urf8mb4并自動轉換字符集.

For example, to use 4-byte UTF-8 character sets with Connector/J, configure the MySQL server with character_set_server=utf8mb4, and leave characterEncoding out of the Connector/J connection string. Connector/J will then autodetect the UTF-8 setting. – [MySQL:Using Character Sets and Unicode][3]

后來科普了一下, 在每一次查詢請求的時候, 可以顯式的指定使用的字符集, 使用 set names utf8mb4 可以指定本次鏈接的字符集為utf8mb4, 但這個設置在每次連接被釋放后都會失效.

目前的解決辦法是, 在需要插入utf8mb4的時候, 顯示地調用執行set names utf8mb4, 如:

jdbcTemplate.execute("set names utf8mb4");jdbcTempalte.execute("...");

需要注意的是, 我們在使用一下ORM框架的時候, 因為性能優化原因, 框架會延遲提交, 除非事務結束或者用戶主動調用強制提交, 負責執行的set names utf8mb4仍然不會生效.

在這里我使用的是myBatis, 以MessageDao為例

// MessageDaopublic interface MessageDao { @Update("set names utf8mb4") public void setCharsetToUtf8mb4(); @Insert("insert into tb_message ......") public void insert(Message msg);}// test codeSqlSession sqlSession = sqlSessioFactory.openSession();messageDao = sqlSession.getMapper(MessageDao.class);messageDao.setCharsetToUtf8mb4();// 強制提交sqlSession.commit();messageDao.insert(message);

至此, 問題便解決了..

哎, 如果世事能那么順利就好了, 在項目中, mybatis是實例是交由Spring去管理的, 也就是說我拿不到sqlSession, 也就是強制提交不了. 并且因為Spring事務框架的限制, 他并不允許用戶顯式調用強制提交. 目前還在糾結這個問題.

有兩個解決思路:

  • 使用AOP, 在可能插入4字節UTF8字符的時候, 前置方法執行set names utf8mb4, 但該方案還不能確定AOP的方法會被Spring進行事務管理么, 并且在前置方法中,拿到的鏈接是否和接下來拿到的連接對象是同一個session.
  • 研究Spring JDBC的創建方法, 寫一個hook在每次創建新的數據庫連接的時候, 都執行一次set names utf8mb4, 這樣就保證每一次拿到的鏈接都是設置過字符集的.

總結

以上就是這篇文章的全部內容了,待有時間再實驗一下以上兩種方案。希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频在线播放| 亚洲欧美精品伊人久久| 伊人成人开心激情综合网| 欧美激情在线播放| 中文字幕亚洲无线码a| 欧美亚洲国产视频小说| 亚洲国产精品国自产拍av秋霞| 九九热在线精品视频| 亚洲一区久久久| 国产精品电影网| 欧美日韩国产二区| 97avcom| 国产亚洲一区二区精品| 日韩av观看网址| 亚洲影院污污.| 久久久午夜视频| 色视频www在线播放国产成人| 成人网欧美在线视频| 一区二区三区天堂av| 欧美极品少妇全裸体| 亚洲在线一区二区| 亚洲美女www午夜| 不卡伊人av在线播放| 亚洲aⅴ日韩av电影在线观看| 国产成人综合精品| 成人黄色av网| 日韩高清av在线| 成人a在线视频| 亚洲欧洲日产国码av系列天堂| 亚洲成人网在线观看| 亚洲国产精品va在看黑人| 欧美日本中文字幕| 亚洲综合中文字幕在线| 自拍视频国产精品| 国产精品久久久久999| 国产日产欧美a一级在线| 2019中文字幕在线免费观看| 亚洲精品久久7777777| 欧美精品18videosex性欧美| 北条麻妃99精品青青久久| 欧美日韩在线另类| 欧美成人免费va影院高清| 精品网站999www| 有码中文亚洲精品| 日韩欧美有码在线| 成人免费网站在线观看| 日本不卡免费高清视频| 青草青草久热精品视频在线网站| 韩曰欧美视频免费观看| 国产精品久久久久久久9999| 伊人伊人伊人久久| 久久久久久久久久婷婷| 久久久av网站| 国产精品国产亚洲伊人久久| 国产精品高潮在线| 亚洲欧美另类在线观看| 久久激情五月丁香伊人| 69av成年福利视频| 91久久久久久国产精品| 美女福利视频一区| 日韩视频―中文字幕| 欧美成年人视频网站欧美| 国产精品久久久久久久久| 国产一区二区三区四区福利| 欧日韩不卡在线视频| 色爱av美腿丝袜综合粉嫩av| 国产亚洲精品va在线观看| 国产精品久久久久久久久久久久久| 亚洲一区二区免费在线| 成人免费自拍视频| 欧美视频13p| 欧美另类69精品久久久久9999| 海角国产乱辈乱精品视频| 欧美日韩亚洲高清| 欧美电影电视剧在线观看| 亚洲一区亚洲二区亚洲三区| 久久91精品国产91久久久| 亚洲国产高潮在线观看| 日韩av免费看网站| 亚洲精品国精品久久99热| 国产精品欧美一区二区| 亚洲偷熟乱区亚洲香蕉av| 精品亚洲精品福利线在观看| 国产日韩精品一区二区| 亚洲一区中文字幕| 亚洲a级在线观看| 久久免费成人精品视频| 亚洲免费视频观看| 热门国产精品亚洲第一区在线| 国产成人精品亚洲精品| 国产精品久久久久av免费| 国产精品丝袜久久久久久高清| 成年人精品视频| 日韩暖暖在线视频| 国产成人一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美性高跟鞋xxxxhd| 日韩免费高清在线观看| 一区二区欧美在线| 欧美日产国产成人免费图片| 国产一区二区三区精品久久久| 91精品国产91久久久久| 最新国产精品拍自在线播放| 久久久久在线观看| 国产亚洲视频中文字幕视频| 欧美视频专区一二在线观看| 欧美激情精品久久久久久大尺度| 亚洲国产成人精品电影| 日韩在线观看免费| 色悠悠久久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲精品福利在线观看| 午夜免费久久久久| 国产精品久久久久久久午夜| 欧美人与物videos| 久久精品小视频| 久久国产精品久久久久久久久久| 亚洲男人天天操| 亚洲第一精品夜夜躁人人爽| 国产精品丝袜久久久久久不卡| 69久久夜色精品国产69| 国产91对白在线播放| 成人性生交大片免费看视频直播| 日韩av网站电影| 毛片精品免费在线观看| 奇米成人av国产一区二区三区| 成人福利网站在线观看| 亚洲美女av黄| 欧美成人亚洲成人| 久久免费精品视频| 亚洲人成在线观看网站高清| 欧美午夜女人视频在线| 日韩电影免费观看中文字幕| 亚洲深夜福利网站| 亚洲精品国产品国语在线| 欧美日韩加勒比精品一区| 国产性猛交xxxx免费看久久| 欧美日韩一区二区在线| 亚洲精品乱码久久久久久按摩观| 亚洲色图35p| 精品成人在线视频| 日韩欧美a级成人黄色| 精品久久久久久久久久国产| 欧美日韩一区二区三区| 亚洲视频在线看| 亚洲va久久久噜噜噜| 国产精品久久久久久av| 中文字幕无线精品亚洲乱码一区| 日韩小视频在线观看| 欧美视频免费在线观看| 亚洲天堂成人在线视频| 精品福利在线视频| 96sao精品视频在线观看| 18性欧美xxxⅹ性满足| 伊人成人开心激情综合网| 日韩av在线网| 日韩风俗一区 二区| 不卡av在线网站| 欧美日在线观看| 91影院在线免费观看视频| 久久99久久久久久久噜噜| 成人自拍性视频| 成人黄色片在线| 久久久久久欧美|