-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mysql数据库乱码的那些事 #3
Comments
我们之前还遇到过emoji的编码问题,就是聊天被存储到MySql,但是内容是emoji,后来就会造成运行错误,查询资料说是建立数据库时得使用utf8-mb4,可是好像没什么效果,请问@cjuexuan 在这方面有经验么? |
@hepin1989 ,http://my.oschina.net/wingyiu/blog/153357 ,希望能帮到你,不过这篇文章的意思是客户端存储的时候还需要统一处理,不知道你们的情况是个什么情况,mysql的版本呢 |
@hepin1989 还有你那个没什么效果的意思指的是存储的时候会报错还是取出的时候会乱码,你们alter table以后有再次检查编码么 |
@cjuexuan thanks,我们现在还是5.6,客户端最后的处理是做了过滤。没有效果是指光在建库的时候指定了编码格式而已。所以我们现在不能发表情。 |
@hepin1989 其实没必要整个database级别改变,只需要在Column中指定而实现细粒度控制,类似链接中的 |
数据库层面的乱码
数据库的默认编码方式为latina
而我们集成开发时通过JDBC或者Hibernate写入数据时从前端获取的通常都是utf8,自然会出现乱码
可以通过show variables like 'char%'查看数据库的编码方式
而在命令行中set names utf8可解决乱码问题,但此次设置只对本次有效,如果开发过程中忘了在存之前切换到数据库进行设置依然会乱码
命令character-set-client 编码设置数据库的客户端发送编码方式
character-set-connection编码设置数据库转化器的编码方式
character-set-results编码设置客户端接受的(返回结果)
但最好的方式是写入mysql的配置文件
在win下配置文件时mysql的主目录下的my.ini,在linux下是etc目录下的my.cnf
设置客户端
设置服务器端
在老版本中和设置客户端的方法一致
但5.6以后的版本改成了下面的命令
如果你不确定就试一下,如果出现1067错误就是配置文件有误,改成另一种形式即可
最后查看一下,我的已经生效了'char%'
原理图
web层面乱码:
1.响应乱码的原理
字节方式输出数据:
response.getOutputStream().write("中国".getBytes("utf-8"));
服务器在发送中文数据时,使用的是UTF-8码表,IE浏览器没有特别指定码表时,将使用所在操作系统的默认码表,gb2312,utf-8的数据用国标2312打开就自然出现乱码问题
解决方法
在HTTP协议中提供了Content-Type响应头:
快速设置的方法:
字符方式输出数据:
Response.getWriter().write("中国")输出数据给浏览器,则服务器会在发送数据时将字符转换为字节后发送,tomcat6默认的编码方式为iso8859-1,不支持中文的读写,则变成了"?"
解决方法
把服务器设置为发送数据时使用的正确码表即可,两码相同防止乱码
设置浏览器打开和发送数据的编码方式
2.请求乱码的原理
浏览器发送请求的编码会和打开表单页面时使用的编码一致
设置方式为pageEncoding
服务器的解析则是默认编码方式,tomcat默认的iso8859-1解码,而自生设置utf-8编码,utf-8三个字节一个汉字,iso8859-1一个字节一个字符,则中国在utf-8的编码下为6个字节,iso8859-1下则显示6个问号
解决思路
对post提交做设置
设置utf8处理请求参数,但有一定的作用域和处理范围,只能处理post
对于get提交的乱码
可以使用底层转化:
将乱码解析为二进制数据
解码方式换成utf8
注意
有可能你已经改好了可是还是乱码存在,那是因为你原来的表和库依然为拉丁的编码,并没有改成utf8,所以会出现这样的问题,对应修改即可,如果查看表则使用
The text was updated successfully, but these errors were encountered: