模糊查询书按照书名-------------------
java.sql.SQLException: Illegal mix of collations (gb2312_chinese_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)
MySql中的编码集为:utf-8 或gbk 都试过了,还是出现这样的错误jsp文件为utf-8的我的查询语句为:String sql="SELECT `books`.`id`, `books`.`book_name`,`books`.`price`,`books`.`book_info`," +
"`books`.`author`,`books`.`img_url`  " +
" FROM `books` " +
"where `books`.`book_name` like ? ";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, '%'+bkname+'%');
ResultSet rs=ps.executeQuery();错在哪里,实在是找不出原因了。求助高手帮帮忙!!谢谢!!

解决方案 »

  1.   

    补充下,上面的错误信息显示不够完整:
    模糊查询书按照书名-------------------
    java.sql.SQLException: Illegal mix of collations (gb2312_chinese_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)
    at com.dong.bean.BookBean.findByName(BookBean.java:137)
    at org.apache.jsp.showBook_jsp._jspService(showBook_jsp.java:95)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)
      

  2.   


    ps.setString(1, "'%"+bkname+"%'"); 
      

  3.   


    ps.setString(1, "%"+bkname+"%");
    同样出现上面的错误
      

  4.   

    数据库编码是gbk的吧!show variables like 'character_set_%';看一下数据库中的编码是什么?
      

  5.   

    有几个编码的,都是gb2312吗?客户端编码应该要跟你在页面中的编码保持一致。
    character_set_client
      

  6.   


    现在把数据库编码方式改为gbk,
    我的jsp的编码方式为utf-8
    这样还是有同样错误
    到底改成什么样的编码方式呢
    求救!!
      

  7.   

    现在把数据库编码方式改为utf-8, 
    我的jsp的编码方式为utf-8 
    也不行
      

  8.   

    String sql="SELECT `books`.`id`, `books`.`book_name`,`books`.`price`,`books`.`book_info`," + 
    "`books`.`author`,`books`.`img_url`  " + 
    " FROM `books` " + 
    "where `books`.`book_name` like ? "; 
    呵呵,没太看懂,引号太多了吧?学过SQL Server,也在MySQL下用过命令行操作各种SQL语句
    先这样试试string sql = "select * from tablename where condition like ?";
      

  9.   

    先写好sql语句测试可以在mysql中执行(变量赋上一个值),java中执行sql语句前打印出语句比较一下
      

  10.   


    先查select * from book;试试看会不会出问题,缩小问题的范围,应该就是你这第语句的写法的问题,我没见过这么多引号的SQL语句 books.book_name直接就这样引用就行了吧?
      

  11.   

    SELECT
    `books`.`id`,
    `books`.`book_name`,
    `books`.`price`,
    `books`.`book_info`,
    `books`.`author`,
    `books`.`img_url`
    FROM
    `books`
    where `books`.`book_name` like '%寻找%'
    上面是MySql中查询器中运行时的代码
    正常运行,能出现想要的结果,
    就是在java代码中不能,出现错误
      

  12.   


    引号都是MySql自己生成的,没有语法错误的
      

  13.   

    首先测试下,将SQL语句打印出来执行
      

  14.   

    在java代码中select * from 表名 试一下看报不报错?
      

  15.   


    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;import com.dong.bean.BookBean;
    import com.dong.po.Book;public class MysqlTest {
    public static void main(String[] args) {
    BookBean bookBean=new BookBean();
    Collection<Book> collection=new ArrayList<Book>();
    collection=bookBean.findByName("寻找");
    System.out.println(collection.size());
    for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
    Book book = (Book) iterator.next();
    System.out.println(book.getBook_name());
    }

    }
    }1
    书名:寻找大池塘的青蛙
    测试正确,没有错误!!
      

  16.   

    ps.setString(1,"'%"+bkname+"%'");
    为什么要这样写????
      

  17.   

    bkname是字符串类型,在程序中写跟在mysql命令行写实一样的。
    在命令行写的格式:select * from tb_name where name like '%dd%';
    在程序中一样的道理。
      

  18.   


    在哪里加啊?
    ps.setString(1,"'%"+bkname+"%'"); 
    测试时就不通过了。
      

  19.   

    你sql语句里字符串是要加单引号的,那你拼出来的sql里的字符串也要有啊。
      

  20.   

    数据库编码和Java编码不一致。你先用Java查询出来一些书的数据看看显示出来的是不是乱码?
    如果是乱码的话你就应该考虑JSP或者数据库换编码方式了。不知道数据库改变编码后其内部数据是不是也自动的转换编码方式。
      

  21.   

    Illegal mix of collations 
    非法混合排序规则,估计是编码的问题。确保数据库,jsp,servlet编码的统一
      

  22.   

    发现一个新问题
     <%=request.getParameter("bkname") %>
    打印出来是乱码我jsp的编码为:utf-8;
    Book类为默认编码为:gbk
    可是Book类的编码不能改,如果改了里面的代码有些就乱码了,而且运行错误
    怎么办呢??求救!!!!!!!!!!!!!!!!!!!!!
      

  23.   

    ps.setString(1,"%‘"+bkname+"’%"); 
    ps.setString(1,"%"+“‘”+bkname+“’”+"%"); 
    都试试
    不知道对不