【java】【mysql】存储微信表情emoji表情
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n '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)
当报以上错误的时候,可能是java代码中的字段与数据库中的字段类型或者编码不匹配,这种情况只要统一格式或者编码就就可以了。
这里主要介绍emoji的图像插入数据库的错误以及解决方法
使用mysql数据库的时候,如果字符集是UTF-8并且在java服务器上,当存储emoji表情的时候,会抛出以上异常(比如微信开发获取用户昵称,有的用户的昵称用的是emoji的图像)
这是由于字符集不支持的异常,因为utf-8编码有可能是两个,三个,四个字节,其中Emoji表情是四个字节,而mysql的utf-8编码最多三个字节,所以导致数据插不进去。
解决方式:
一.从数据库层面进行解决(mysql支持utf8mb4的版本是5.5.3+,必须升级到较新版本)
注意:
(1.修改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;
(2.修改mysql配置文件my.cnf(window为my.ini)
[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'
(3.用的是java服务器,升级或者确保mysql connection版本高于5.1.13否则仍然不能试用utf8mb4
(4.服务器端的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
如果升级了mysql-connector,其中的characterEncoding=utf8可以自动被识别为utf8mb4(兼容原来的utf8),而
autoReconnection(当数据库连接异常中断时,是否自动重新连接?默认为false)强烈建议配上,忽略这个属性,可能导致缓存缘故 ,
没有读取到DB最新的配置,导致一直无法试用utf8mb4字符集;
详细可见 :
http://segmentfault.com/a/1190000000616820
二.从应用层的方面进行解决
在获得数据之后往数据库存之前先进行编码:
URLEncoder.encode(nickName, "utf-8");
当从数据库中取出准备显示的时候进行解码,
URLDecoder.decode(nickname, "utf-8");
从应用层进行解决的时候建议不要在对象getter,setter方法中直接编码,因为放入对象的时候setter方法将nickname进行编码,当插入数据库的时候相当于从对象中调用getter方法将你参考取出这就将之前setter编码过的nickname又重新解码了,等于未对Nickname进行任何操作。依然会出现以上问题。
==============================
老司机地址:http://www.cnblogs.com/dashuai01/p/4601204.html
【java】【mysql】存储微信表情emoji表情的更多相关文章
- mysql存储emoji表情报错处理,qq互联mysql存储昵称中带表情的数据时报错。
前言 做qq互联登录时发现一个问题,如果qq昵称中有表情时存入mysql数据库会报错. java.sql.SQLException: Incorrect string value: "ð&q ...
- mysql数据库怎么存入emoji表情,更改utf8mb4后为什么出现全是问号
在项目中遇到有人存emoji表情,出现如下错误: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum ...
- mysql支持IOS的Emoji表情
原因: UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 解决办法: 将Mysql的编码从utf8转换成utf8mb4 ...
- PHP Mysql字符集utf8mb4支持Emoji表情
项目开发中经常会遇到用户在评论或者发表文章的时候会打一些表情在里面,如果我们在开发中不去做一些处理的话,表情会出不来的,甚至是报错,下面简单介绍处理方式.原文地址:小时刻个人博客:http://sma ...
- 解决 微信包含emoji表情的昵称,直接用sql语句可以写入而在yii2框架写却写不成功的 问题
背景: 首先是emoji表情写入不成功,在网上查了许多资料,包括配置mysql,重启mysql等等,这样之后发现还是写入失败. 将sql语句复制出来,直接粘贴到mysql客户端执行,发现没问题.而通过 ...
- php 解决微信昵称emoji表情插入MySQL报错
在PHP接受到微信用户昵称入库的时候报错 原因:utf-8 最大3个字节,而emoji占4个字节 解决办法: 1.修改mysql 数据库的字符集,改为utf8mb4,但是前提是MySQL的版本需要5. ...
- mysql存储4字节的表情包数据报异常_Emoji表情包_Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F
本文章转载自:https://www.cnblogs.com/coprince/p/7485968.html 原文如下: 问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varch ...
- 修改Mysql 字符集,支持Emoji表情
插入失败 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at ...
- mysql数据库怎么存入emoji表情
第一步 设置数据库字符编码为utf8mb4_general_ci 设置相应表字段字符编码为utf8mb4_general_ci 第二步 设置my.cnf增加以下配置信息 [client] defau ...
随机推荐
- scala学习7--class、object、trait
scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用不同的表达方式,cla ...
- GDB调试实用命令
个人感觉从windows平台转到linux平台一个不适应的地方就是调试器的使用.因为windows下调试器基本上都依赖快捷键和图像界面来完成操作,就算是windbg这种伪命令行的工具,命令也很简单比较 ...
- 强大到无与伦比的Graphviz
图1 hello world 尝试画复杂一些的图: 一直苦苦寻找用于图论的画图软件,偶然在Matrix67的这篇博文里找到. Graphviz使用dot语言,这门不仅语言非常简单易学,而且功能却非常强 ...
- day5 常用模块json和pickle
json 和 pickle json和pickle是用于字符串序列化和反序列化的过程,我们在存储和使用的时候,经常把列表存入文件,读取的时候我们还想以列表的形式读取.就需要使用json和pickle. ...
- function(函数)中的动态参数
我们可向函数传递动态参数,*args,**kwargs,首先我们来看*args,示例如下: 1.show(*args) def show(*args): print(args,type(arg ...
- 【caffe-Windows】微软官方caffe之matlab接口配置,以及安装caffe的注意事项
1.在此之前,记录一下之前的错误,在参考博客[caffe-Windows]caffe+VS2013+Windows+GPU配置+cifar使用进行caffe的安装时,其中的一些步骤可以不做,具体见下图 ...
- 三年.NET即将转Java,我该何去何从
2014年5月,大三报了某培训班5个月学习.NET 2014年12月-2015年6月,在某软件公司实习,用ASP.NET开发企业级系统 2015年7月-2017年3月,从毕业生到成为该公司的主要开发人 ...
- 将 Unity5.3 的老项目升级到 Unity 2018.3 遇到的些许问题。
删除 ParticleEmmiter 等废弃的接口: 删除 WindowsSecurityContext System.Security.Principal.WindowsIdentity 在 .Ne ...
- EL和JSTL的关系
JSTL与EL的关系:EL的功能是有限的,去集合只能取特定的某一个元素,如果遍历或循环就不行了,或者添加一些条件分支判断也不行,或做一些格式化,比如日期的格式化,数字的格式化,也不行,所以要做这些功能 ...
- Linux中磁盘还有空间,但创建文件时提示空间不足
首先需要知道创建文件时,需要满足两个条件:1.磁盘上还有空间:2.inode号还有剩余. 这两个条件可以分别使用"df -h"以及"df -i"查看使用情况 [ ...