mysql字符编码坑

今天发现servlet插入中文数据进入数据库失败,在数据库中全部显示为??

查询后发现Mysql默认使用的是latin-1编码

尝试进行修复

step1

在mysql中修改编码字符编码
set character_set_client=utf8;
set character_set_connection=utf8;
set character_set_database=utf8;
set character_set_results=utf8;
set character_set_server=utf8;
set character_set_system=utf8;

并修改conf文件
Add
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8

step2

修改后又遇到了另一个问题,此时插入数据时遇到error
java.sql.SQLException: Incorrect string value: ‘\xE9\x98\xBF\xE8\x90\xA8…’ for column ‘detail’ at row 1查询后发现,在mysql中每一个table都有独立的字符集
可以这样查看
show create table tbname;
然后这样进行修改
ALTER TABLE tbname CONVERT TO CHARACTER SET utf8;
修改后测试

测试成功功功功功你个头啊……
然后又遇到问题了orz

step3

这次发现通过QueryParam获得的参数编码就有问题!
插入数据库后变成了这样

神了tm的蛇皮棒棒奇了
在本地有这个问题 但是部署到服务器上之后却没有……
但是还是研究一下吧

研究resteasy指定读取utf8无果(也有可能是tomcat的问题,不确定)
找到了一条兼容性修复办法
detail=new String(detail.getBytes(“iso-8859-1″),”utf-8”);
得到该字符串底层byte后再重新作为utf8读取,此时测试全部成功

傻逼latin-1, 谁用谁傻逼

注意此处有另一个坑,mysql的utf8其实是utf6,要使用真正的utf8得用utf8mb4词缀(咕咕咕,之后再说,utf6又不是不能用)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据