大家好,我在做SSH过种中,碰到一个问题,找了很久都没有答案:
在Struts中用Hibernate根据用户名和密码查询用户中:
如果用户名为中文字符,比如(张三,123456),刚语句
from UserAccount where name=? and passwd=?
返回的列表为空,但是在SQL*Plus中执行语句
select count(*) from user_account where name='张三' and passwd='123456';
则返回1;
但是如果用户名为半角字符,比如(zhangsan,123456),则Hibernate可以正确返回!!说明下:
我的程序字符集是UTF-8;
如果查询全部from UserAccount可以全部查出,并且名字都能显示正确;
目前也许就只是参数不能为中文.不知是该如何解决,请各位高手多多指教?多谢了.
在Struts中用Hibernate根据用户名和密码查询用户中:
如果用户名为中文字符,比如(张三,123456),刚语句
from UserAccount where name=? and passwd=?
返回的列表为空,但是在SQL*Plus中执行语句
select count(*) from user_account where name='张三' and passwd='123456';
则返回1;
但是如果用户名为半角字符,比如(zhangsan,123456),则Hibernate可以正确返回!!说明下:
我的程序字符集是UTF-8;
如果查询全部from UserAccount可以全部查出,并且名字都能显示正确;
目前也许就只是参数不能为中文.不知是该如何解决,请各位高手多多指教?多谢了.
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>Struts2字符集?
struts.properties
struts.i18n.encoding=UTF-8Struts1字符集?
web.xml
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>..SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>还有服务器字符集,如tomcat
C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\server.xml
<Connector
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>慢慢查吧,麻烦
我发现一个问题:
如果HQL不用占位符,而是直接拼接成SQL语句,查询正确.List<UserAccount> users = this.hibernateTemplate.find("from UserAccount where name=? and passwd=?", new String[]{name, passwd});当参数中有中文时,查询返回为空;但是:
StringBuilder sql = new StringBuilder();
.........(把参数拼接成一条SQL语句)
List<UserAccount> users = this.hibernateTemplate.find(sql.toString());却可以正确返回.
String str = new String("张三".getBytes("iso-8859-1"),"utf-8");
1. 在调用hsql之前,把name打印出来看看,
2. 配置log或者配置p6spy作为jdbc driver,把参数和sql打出来看看。