在使用“limit”子句中的参数执行查询后,我试图从准备好的语句中获取元数据:
PreparedStatement ps = conn.prepareStatement("select * from tbl limit ?, ?");
ps.setLong(1, 0);
ps.setLong(2, 10);
ps.execute();
ResultSetMetaData rsmd = ps.getMetaData();
最后一行代码抛出异常:
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''', ''' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.Util.getInstance(Util.java:382)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
at com.mysql.jdbc.PreparedStatement.getMetaData(PreparedStatement.java:2882)
at ...... <my classes>
当我跳过检索 ResultSetMetaData 时,代码工作正常。 我在互联网和错误数据库中找不到任何关于错误的提及。
我试过以下版本的连接器/J:5.1.14、5.1.12、5.1.9(Maven 依赖项)。
服务器版本是5.0.77
谁能帮帮我?
最佳答案
这是因为在执行“setLong()”时准备好的语句如何分配参数。
当您在准备好的语句中使用 setter 时,它会将参数括在单引号中。
我不确定“executeQuery”为何起作用。 如果您直接执行以下查询,您将看到类似的异常。
"select * from tbl limit '0', '10'"
改为使用以下内容。
int startLimit = 0;
int endLimit = 10;
PreparedStatement ps = conn.prepareStatement("select * from tbl limit " + startLimit + " , " + endLimit);
ps.execute();
// you can use "Statement" if you dont have any more parameters
关于java - 为 "select ... limit ?,?"准备好的查询检索元数据时出现 MySQLSyntaxErrorException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6138394/