注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红尘若梦

生活的色彩

 
 
 

日志

 
 

Openfire离线消息错误日志java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x95\xF0\x9F...'的解决方案  

2015-12-13 13:28:39|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近在做一个社交APP后台,作用Openfire开源框架,结果发现离线消息老是报错误,SQL异常。一查错误日志,发现出错的原因都是因为,\xF0\x9F\x90\x94这些字符的原因,很多人说这种错误是因为mysql不能识别4个字节二进制的utf8编码字符,所以抛出了异常,这也是问题的根源。下面就来提出解决方案:
1)简单直接的解决方案,应该是直接将这些二进制数据转换后再存入数据库,如Java先做转换 String.getBytes("UTF-8"),然后取数据后同样再做转换new String(bytes, "UTF-8")。
2)修改表或列字符集为UTF-8,也可以达成目的。

alter table `ofOffline` default charset utf8;

alter table `ofOffline` change `stanza` `stanza` text character set utf8 NOT NULL;

3)修改mysql配置文件my.cnf,将数据库系统字符集设置成如下,再重启Mysql:

[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4

4)第四种,也是最简单的最有效率,直接将存储离线消息的字段类型改成Blob,MYSQL的BLOB类型的字段正用于存储二进制数据,所以完全可以存储UTF-8编码后的二进制数据。

alter table `ofOffline` change `stanza` `stanza` blob NOT NULL;

一切都解决了,无论是正常的字符,还是特殊的二进制数据字符,都毫无问题了。看来设计表字段时还真的需要考虑下一些可能有的特殊编码问题,而不能就想方便使用默认编码。请注意:如果使用BLOB,因为数据库完全按二进制保存,所以请注意编码问题。

  评论这张
 
阅读(65)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017