mysql存儲4位元組的表情包數據報異常_Emoji表情包_Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

来源:https://www.cnblogs.com/lxhbky/archive/2019/11/07/11812347.html

本文章轉載自:https://www.cnblogs.com/coprince/p/7485968.html 原文如下: 問題描述:從新浪微博抓取消息保存到MySQL數據中,對應資料庫欄位為varchar,字元編碼utf-8。部分插入成功,部分插入失敗,報錯如標題。 在網上查詢,有人說是編碼問題,建 ...


本文章轉載自:https://www.cnblogs.com/coprince/p/7485968.html

 

原文如下:

 

問題描述:從新浪微博抓取消息保存到MySQL數據中,對應資料庫欄位為varchar,字元編碼utf-8。部分插入成功,部分插入失敗,報錯如標題。

在網上查詢,有人說是編碼問題,建議修改編碼格式,比如改成gbk,UTF-8,blob等等,但是幾乎沒有人給出更詳細的答案。在一個英文網站上,才發現真正錯誤的原因。鏈接1 鏈接2

 

錯誤原因:我們可以看到錯誤提示中的字元0xF0 0x9F 0x98 0x84 ,這對應UTF-8編碼格式中的4位元組編碼(UTF-8編碼規範)。正常的漢字一般不會超過3個位元組,為什麼為出現4個位元組呢?實際上是它對應的是智能手機輸入法中的表情。那為什麼會報錯呢?因為mysql中的utf-8並不是真正意義上的utf-8,它只能存儲1~3個位元組長度的utf-8編碼,如果想存儲4個位元組的必須用utf8mb4類型。不而要使用utf8mb4類型,首先要保證Mysql版本要不低於 MySQL 5.5.3。

 

解決方案:

1)使用utf8mb4數據類型

   要用這種策略,如果MySql版本低於5.5.3,首先要進行版本升級,然後將對應的數據類型改為utf8mb4類型。如果使用的是Connector/J 連接資料庫,需要在配置中把編碼格式改為utf8mb4(set character_set_server=utf8mb4 in the connection config)。

2)自定義過濾規則,將文本中出現的四位元組UTF-8字元過濾或轉化為自定義類型。

    下麵是將4位元組字元轉化為0000的測試例子。

for (int i = 0; i < b_text.length; i++) 
{ 
    if((b_text[i] & 0xF8)== 0xF0){ 
        for (int j = 0; j < 4; j++) {                         
        b_text[i+j]=0x3f;        
    } 
    i+=3; 
    } 
} 

 

 

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

更多相關文章
  • 1.什麼是InfluxDB? "InfluxDB" 是一個用Go語言開發的時序資料庫,用於處理高寫入和查詢負載,專門為帶時間戳的數據編寫,對DevOps監控,IoT監控和實時分析等應用場景非常有用。通過自定義配置讓InfluxDB保留規定時間內的數據,並自動從系統中刪除不在規定時間內的數據,可以節省 ...
  • 1.什麼是Telegraf? Telegraf是一個用Go語言開發的代理程式,可用於收集和報告指標。Telegraf插件直接從其運行的系統中獲取各種指標,從第三方API中提取指標,甚至通過StatsD和Kafka消費者服務來監聽指標。它還具有輸出插件,可以將指標發送到各種其他數據存儲,服務和消息隊列 ...
  • 1、redis連接、及存取值 import redis r = redis.Redis(host='192.168.2.22',port=6379,db=2,password= 'redis') r.set('name','Delia') # 在redis裡面放置對應的key,value v = r ...
  • elastic search 集群新增node 同一臺物理機 ...
  • 主備切換在備庫startup時出現歸檔路徑沒寫到spfile里...註意:修改參數時最好帶上scope=spfile或scope=both,以免重啟出現異常。SQL> startup mountORA-16032: parameter LOG_ARCHIVE_DEST_1 destination s ...
一周排行
x