关于字符的又一问题--已解决,与mysql有关

来源:互联网 发布:联通拨号软件 编辑:程序博客网 时间:2024/06/05 09:48

曾经以为自己对字符乱码很清楚了,今天又出现了一个问题。

先说说系统框架: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