当前位置: 首页 >数据库 > unicode表情插入数据库的问题,Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

unicode表情插入数据库的问题,Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

问题描述:从新浪微博抓取消息保存到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的测试例子。

 

 

[java] view plain copy
 
  1. for (int i = 0; i < b_text.length; i++)  
  2. {  
  3.     if((b_text[i] & 0xF8)== 0xF0){  
  4.         for (int j = 0; j < 4; j++) {                          
  5.         b_text[i+j]=0x30;                     
  6.     }  
  7.     i+=3;  
  8.     }  
  9. }  

作者:精进中的昆杰
来源链接:https://www.cnblogs.com/leekenky/p/5790641.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/database/117533.html

标签:MySQL升级
分享给朋友:

“unicode表情插入数据库的问题,Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F” 的相关文章

JDBC工具类(DButil) 2022年05月13日 09:13:25
MySQL触发器 2022年05月16日 21:53:36
MySQL面试有这一篇就够了 2022年05月16日 21:53:45
Mysql 查询结果赋值到变量 2022年06月07日 12:35:42
mysql 查询表中前10条数据 2022年06月08日 04:35:17
mysql查询字段为null 返回0 2022年06月10日 20:48:10
mysql 查询列拼接字段 2022年06月12日 09:17:20
mysql查询重复的 2022年06月12日 13:49:33
mysql查询前几条记录 2022年06月13日 21:46:10