曾经以为自己对字符乱码很清楚了,今天又出现了一个问题。
先说说系统框架:struts2+hibernte3.3+sprint2.5,linux+resin+mysql
在我的电脑(windows)下没有问题,布到服务器后,出现问题。
问题:
1.从表单输入特殊汉字,比如“涅槃”,页面显示为“涅??”,但奇怪的是,数据库里数据正确。
2.将从数据库读到的??转换成字节,打印为63 63,而正确应为-104,-124
3.从表单输入“涅槃”搜索,结果为空。。搜索"涅%",却出现包括涅槃在内,以及没有涅字的一些数据。
疑问:
在哪一步出现了编码问题?为什么只针对特殊汉字?注字符集设置为GBK,理论上不应该出问题才是。
------------------------------------------------------------------------------------------------------------------------------------------------------
解决:首先先允许我大笑三声。高兴的!
问题1、2:
步骤1:使用java.sql里的类,连接、查找、得到ResultSet,取rs.getString(1).getBytes(),打印为63 63;
可知,与hibernate无关,但数据库里数据正确,应该是在取数据时,里某些内部操作造成。
步骤2:还是以面的ResultSet,使用rs.getBytes(),打印为-104,-124。。。。正确。。高兴
可知以字符流的形式可以正确读出。
然后查看了mysql的编码设置 与 我电脑上不同的有:
character_set_server与database=binary 我的为 latin1
有点意思了。我们知道MYSQL的输入,读出过程为
latin1--> latin1 --> binary binary --> latin1 --> latin1
client-->connection-->server 与 server-->connection-->client
应该是在server-->connection出现意外??
所以,心里有两个方法:
A。设置配置文件character_set_server=latin1-------------因为我没有服务器root权限,没有验证
B。将hibernate配置文件里相关字段类型由string改为binary ,java文件相关字段由string改为byte[],此方法验证正确
问题3:
出现搜索问题是因为mysql的缺陷,select语句改为 where binary btitle='涅%' 即可。。字段名前加上binary