小弟用struts2+hibernate3.5+spring2.5开发一个项目。目前在单元测试时遭遇中文编码问题。
非常诡异的是,我在添加中文时没有错误,单元测试通过了,但是在查询时,不用中文的话也通过了,但是带有中文的查询却出错。
MyEclipse提示信息如下:
16:45:02,839  WARN JDBCExceptionReporter:100 - SQL Error: 1054, SQLState: 42S22
16:45:02,839 ERROR JDBCExceptionReporter:101 - Unknown column '??°???' in 'where clause'
junit提示信息:
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2297)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
at org.hibernate.loader.Loader.list(Loader.java:2167)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.wn.rts.manager.impl.DeptManagerImpl.query_dept(DeptManagerImpl.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy12.query_dept(Unknown Source)
at com.wn.rts.manager.impl.DeptManagerImplTest.testQuery_dept(DeptManagerImplTest.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'æ•°å­¦' in 'where clause'
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1026)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3536)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3468)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1957)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2086)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2237)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1849)
at org.hibernate.loader.Loader.doQuery(Loader.java:718)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.doList(Loader.java:2294)
... 42 more请教

解决方案 »

  1.   

    Unknown column '??°???' in 'where clause'
      不要给大家说 你的字段名称是中文的?
      

  2.   

    更改一下mysql的编码,在mysql下的my.ini文件中。default-character-set=utf8
      

  3.   

    hql在底层转换成sql语句错误楼主检查下hql语句
      

  4.   

    当然不可能啊。字段名称是String的。
      

  5.   

    sql语句:select d from Dept as d where 1=1  and d.sn =123 and d.dept =数学
      

  6.   

    解决java下用中文乱码
    public class Tools {
    public static String getNewString(String name) {
    String result ="";
    try {
    result = new String (name.getBytes("iso-8859-1"),"utf-8");
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return result;
    }
    你也可以把utf-8改成gbk,或者gb2312都行。
      

  7.   

    我用的是gbk,还用改成utf-8么?
      

  8.   

    网上搜个过滤器,MySql的编码改成UTF-8
      

  9.   

    hibernate.cfg.xml<property name="connection.url">jdbc:mysql://localhost/hibernate?user=root&amp;password=root&amp;characterEncoding=GBK</property>
    貌似这样可以解决 楼主自己试试吧。
      

  10.   

    你执行查询时的sql里面,有乱码,比如:select * from temp where name="???"
    这个值是你传过来的,而没有处理编码。可以用过滤器,也可以使用new String("???".getBytes(),"gb2312");
      

  11.   

    请首先查找字符串是在哪个环节开始乱的。
    另外,根据你提供的错误信息,程序很显然是把你的中文参数当做column处理了,请检查sql语句语法的正确性乱码问题其实很简单,前后一致自然不会乱 
    请检查PageEncoding、charset、文件编码格式、服务器的URIEncoding格式等等这些相关的地方是否一致
      

  12.   

    你要检查你的hql语句,可能写错了,吧中文弄成字段名字了。当然乱码,另外
    在mysql下的my.ini文件中。default-character-set=utf8
    有两个,第一个要设gbk,第二个utf8,因为第一个是数据库前台编码,第二个是数据库后台编码
      

  13.   

    主要是前台页面和数据库的字符编码不一样,最好统一设置成utf-8
      

  14.   

    我觉得应该是hql语句有问题,错误提示是找不到列啊。Unknown column '??°???' in 'where clause'
      

  15.   

    sql语句的错误,前台传参是String类型,需要加''号。
    String hql = "select d from Dept as d where 1=1 ";
    if(null !=sn && !"".equals(sn)){
    hql += " and d.sn = '"+ sn+"'";
    }
    if( null != dept && !"".equals(dept)){
    hql +=" and d.dept = '"+ dept+"'";
    }
    return this.getSession().createQuery(hql).list();
    }
    哎。
    谢谢大家回复。