微信nickname乱码及mysql编码格式设置(utf8mb4)

今天在写微信公众平台项目时,写到一个用户管理模块,接口神马的已经调试好了,于是将用户从微信服务器保存到本地数据库,发现报错:

java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94‘ for column ‘nickname‘ at row 1

大致说的是保存nickname字段时,发现不正确的字符串值,于是在保存前,将用户的昵称打印了出来,发现有emoji表情,上网查了一下,utf-8大小可能有三种分别为2字节、3字节、4字节,而Mysql中的utf-8编码格式最多支持3字节,所以需要升级Mysql版本及编码格式:

Luckily, MySQL 5.5.3 (released in early 2010) introduced a new encoding called utf8mb4 which maps to proper UTF-8 and thus fully supports Unicode, including astral symbols.

也就是mysql在5.5.3版本中引入新的编码格式,取名为utf8mb4,所以如果你电脑上的版本低于此版本,请先更新电脑中的Mysql版本,查看Mysql版本:

mysql -V
mysql  Ver 14.14 Distrib 5.6.23, for osx10.9 (x86_64) using  EditLine wrapper

发现电脑中的版本没问题,于是直接找改编码格式的方法:

Make sure to set the client and server character set as well. I have the following in my MySQL configuration file (/etc/my.cnf):

于是去查找my.cnf文件所在的方位,在我电脑中路径为(用homebrew安装的)

/usr/local/Cellar/mysql/5.6.23/my.cnf

用sudo vim打开该文件:

$ sudo vim 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

重启mysql服务,查看编码格式

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 |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

发现已经设置成功,于是重新启动程序,发现还是报错,错误还是刚才的错误,这下可以确定问题不在数据库的编码格式中了,于是继续找答案,发现jdbc驱动有问题,当前程序中的驱动版本:

mysql-connector-java-5.1.7-bin.jar

于是去mysql官网找最新jdbc驱动,地址:

http://dev.mysql.com/downloads/file.php?id=456317

版本:

mysql-connector-java-5.1.35-bin.jar

心想这下应该可以了吧,重新启动程序,我靠! 发现还报错,继续是刚才的错误,这下只能找找hibernate配置文件中是否有问题了,hibernate配置文件中的连接地址为:

jdbc:mysql:///wechat_development?useUnicode=true&characterEncoding=utf8 

上stackoverflow中找了找解决方案,里面也没说为何,直接说把后面的useUnicode及characterEncoding直接去掉就好了,于是配置文件变成如下:

jdbc:mysql:///wechat_development 

继续重新启动程序,这下真的保存成功了,而且表情都在~~~~ oh ye

时间: 2024-11-18 08:15:16

微信nickname乱码及mysql编码格式设置(utf8mb4)的相关文章

微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程

转:https://segmentfault.com/a/1190000004594385 项目中涉及保存微信的nickname,之前一直正常使用,但是突然遇到一个之前没有遇到的问题.经过调试发现错误如下: Incorrect string value: '\xF0\x9F\x99\x88\xF0\x9F...' for column 'nickname' at row 1 经过仔细查看发现可以获得nickname的数据,但是无法保存到mysql数据库,查看用户的微信发现在nickname中使用

mysql编码格式设置utf8

对于mysql网站的编码设置,首先参考的是三码合一,具体地址可以从百度搜索相关博文.此处举例http://www.51-n.com/t-4006-1-1.html. 但是在实际应用中,由于mysql版本问题,发现了一些问题,至今看到过一篇文章,但是找不到了.意思是从某个版本开始,mysql配置文件的设置,在[mysqld]下,一般是这样:character-set-server=utf8:可是有的情况是这样:character_set_server=utf8:每当我遇到问题时,我会用这两个分别测

MySQL乱码的原因和设置UTF8数据格式

https://segmentfault.com/a/1190000018662023 MySQL使用时,有一件很痛苦的事情肯定是结果乱码.将编码格式都设置为UTF8可以解决这个问题,我们今天来说下为什么要这么设置,以及怎么设置. MySQL字符格式 字符集 在编程语言中,我们为了防止中文乱码,会使用unicode对中文字符做处理,而为了降低网络带宽和节省存储空间,我们使用UTF8进行编码.对这两者有什么不同不够了解的同学,可以参考Unicode字符集和UTF8编码编码的前世今生这篇文章. 同样

JAVA 常见乱码问题及MYSQL character_set_server 设置

最近接手一个手机端服务端的程序(JAVA实现),我这边测试的话前台直接用的get方式传数据, get请求编码方式和post请求提交编码方式不同,get是把数据直接放到url中,例如以上的uname,IE浏览器先对中文进行utf-8编码(一个中文3个字符表示 太长),继而为了缩短字符又用ISO8859-1编码后传递给服务器.服务器的doGet方法中要先进行ISO8859-1解码再utf-8解码才能看到中文. post请求则在浏览器端把数据以utf-8的形式存储到http的请求体中,不用通过url传

PL/SQL Developer编码格式设置及中文乱码解决方案

1.PL/SQL Developer中文字段显示乱码 原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 2.PL/SQL Developer编码格式设置详细的解决方案如下: 首先,通过 select userenv('language') from dual; 查询oracle服务器端的编码, 如为: AMERICAN_AMERICA.US7ASCII 显示什么编码 就设置什么编码 在我们的客户端需要和服务器端的编码保持一致. 因此在客户端,需要设置环境变量

使用命令行设置MySql编码格式

使用命令行设置MySql编码格式 1.登录mysql 2.输入 SHOW VARIABLES LIKE 'character_set_%'; 3.查看 value值是否为utf8,如果不是,则使用SET设置. 4.SHOW VARIABLES LIKE 'character_set_%';  再次查看确认. 5.最后exit; 完成 2018年10月29日20:52:42 原文地址:https://www.cnblogs.com/lygz/p/9873198.html

MySQL编码格式

一.问题引出 在安装mysql是将其编码格式配置为utf-8,所以此时mysql的 character_set_client, character_set_connection, character_set_database,  character_set_results,  character_set_server, character_set_system编码格式都是utf-8. 查看编码格式的命令如下: mysql> show variables like 'character%'; 当前

mysql字符集设置浅了解

gbk.gb2312:面向使用汉语的中国人 utf-8:相当于兼容模式,缺点是占空间大 utf8_unicode_ci与utf8_general_ci的区别:utf8_general_ci不支持扩展,仅能够在字符之间进行逐个比较.这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的校对规则相比,比较正确性较差.--utf8_unicode_ci与utf8_general_ci的区别 utf8mb4:兼容utf8,且比utf8能表示更多的字符

mysql字符集选用utf8mb4

由于历史的原因,mysql在5.5.3以前的版本提供的utf8字符集并非是真正的utf8,它只是UTF8的一个子集,提供有限的utf8支持.从mysql5.5.3开始,mysql更改了内部细节实现,增加了一个utf8mb4字符集,支持真正的unicode,长度由之前的最大3位延伸到4位,比如表情符之类的字集终于可以贮存到mysql. 无论mysql提供的是旧版本utf8字集还是utf8mb4,php 都能正确处理. 如果你的mysql版本支持utf8mb4,那么最好在my.cnf中增加如下设置: