emoji等表情符號存mysql的方法

来源:https://www.cnblogs.com/ccit/archive/2018/12/04/10064819.html
-Advertisement-
Play Games

項目中需要存儲用戶信息(用戶昵稱有表情符號),自然就遇到了emoji等表情符號如何被mysql DB支持的問題 這裡引用先行者博文:https://segmentfault.com/a/1190000000616820 如果UTF8字元集且是Java伺服器的話,當存儲含有emoji表情時,會拋出類似 ...


項目中需要存儲用戶信息(用戶昵稱有表情符號),自然就遇到了emoji等表情符號如何被mysql DB支持的問題

這裡引用先行者博文:https://segmentfault.com/a/1190000000616820

如果UTF8字元集且是Java伺服器的話,當存儲含有emoji表情時,會拋出類似如下異常:

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)

這就是字元集不支持的異常。因為UTF-8編碼有可能是兩個、三個、四個位元組,其中Emoji表情是4個位元組,而Mysql的utf8編碼最多3個位元組,所以導致了數據插不進去。

升級前需要考慮的問題:

如果你的項目要進行移動產品的用戶文本的存儲,將你的DB字元集從UTF8/GBK等傳統字元集升級到utf8mb4將是勢在必行。你可以通過應用層面轉換emoji等特殊字元,以達到原DB的相容,我認為可行,但是你可能走了彎路。

utf8mb4作為utf8的super set,完全向下相容,所以不用擔心字元的相容性問題。切換中需要顧慮的主要影響是mysql需要重新啟動(雖然mysql官方文檔說可以動態修改配置,但是經過數次測試,還是需要重啟才可生效),對於業務可用率的影響是需要考慮的大問題,這裡就暫時不展開討論了。

升級步驟:

1.utf8mb4的最低mysql版本支持版本為5.5.3+,若不是,請升級到較新版本。

mysql版本查看命令請看:查看mysql版本的四種方法;mysql安裝步驟請看:Linux中升級Mysql到Mysql最新版本的方法
2.修改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;
3.修改mysql配置文件my.cnf(windows為my.ini)

my.cnf一般在etc/mysql/my.cnf位置。找到後請在以下三部分里添加如下內容:

[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'

4.重啟 MySQL Server、檢查字元集

1.)重啟命令參考:/etc/init.d/mysql restart

2.)輸入命令:mysql,進入mysql命令行(如果提示沒許可權,可以嘗試輸入mysql -uroot -p你的密碼)

3.)在mysql命令行中輸入:SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' 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。關於這些字元集配置是乾什麼用的,有什麼區別,請參考:深入Mysql字元集設置

5.如果你用的是java伺服器,升級或確保你的mysql connector版本高於5.1.13,否則仍然無法使用utf8mb4
這是mysql官方release note,大家可以查看說明,並下載最新的mysql connector for java的jar包。
這裡為大家提供一個:mysql-connector-java-5.1.31-bin.jar
同時記得修改pom配置哦~

6.檢查你服務端的db配置文件:

 

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

 

特別說明其中的jdbc.url配置:如果你已經升級好了mysql-connector,其中的characterEncoding=utf8可以被自動被識別為utf8mb4(當然也相容原來的utf8),而autoReconnect配置我強烈建議配上,我之前就是忽略了這個屬性,導致因為緩存緣故,沒有讀取到DB最新配置,導致一直無法使用utf8mb4字元集,多麼痛的領悟!!

源地址:https://segmentfault.com/a/1190000000616820


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在瞭解嵌入式方面的知識,就隨筆記錄一下: 查看Linux本機串口: 1、查看串口是否可用 可以對串口發送數據比如對com1口,echo /dev/ttyS02、查看串口名稱使用 ls -l /dev/ttyS* 一般情況下串口的名稱全部在dev下麵,如果你沒有外插串口卡的話預設是dev下的tty ...
  • 參考資料:https://www.thegeekstuff.com/2012/12/linux tr command/ 簡介 tr命令用於轉換、刪除或者去除重覆字元。它從STDIN中讀取數據並且將其寫入SDTOUT。 因此它的用法是這樣的。從用戶鍵入的STDIN中讀取。 或者這樣的。通過輸入重定向來 ...
  • 與more的區別 more在man手冊中的英文原文是文件熟讀過濾器(file perusal filter),其實可以理解為一種文本查看器。 它存在一些缺點: 必須事先載入完整個文件。因此在遇到大文件的時候,需要等待。 翻閱到文件尾部的時候自動退出。 man手冊也有說明more這個命令已經是比較遠古 ...
  • 創建資料庫 ...
  • 前言 在一個陽光明媚的下午,電腦右下角傳來一片片郵件提醒,同時伴隨著微信釘釘的震動,打開一看,應用各種出錯,天兔告警,資料庫伺服器記憶體爆紅,Mysql資料庫實例掛掉了。 排查 先交代一下資料庫版本: 崩潰故障排除絕不是一項有趣的任務,特別是如果MySQL沒有報告崩潰的原因。例如,當MySQL記憶體不足 ...
  • mysql教程導出資料庫教程幾種方法 方法一 cmd 到mysql bin目錄下用 如下命令 mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-lock-tables databasename>database.sql 把ip改 ...
  • oracle 總結第二篇,主要總結了oracle的表管理中相關註意的問題 ...
  • redis是一種開源的、基於記憶體的、可持久化的、高性能的Key-Value數據存儲系統。 redis能做什麼? 持久化存儲 高速緩存 消息中間件 2.Redis 安裝配置 高性能(記憶體存儲、僅在需要時持久化到硬碟) 數據類型豐富 (string Hash List Set SortedSet) 支持 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...