java - 为 "select ... limit ?,?"准备好的查询检索元数据时出现 MySQLSyntaxErrorException

标签 java mysql exception jdbc metadata

在使用“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/

相关文章:

java - 使用 Mockito 进行单元测试 - 忽略方法调用

mysql - 列数会影响MYSQL速度吗?

java - 是否有可用于抛出异常的方法引用?

java - 如何在批处理中获取包含异常的精确sql查询

java - 如何修复 Pattern.compile(regex, Pattern.CASE_INSENSITIVE) 上的 Sonar 关键问题;

java - 如何创建可在整个应用程序中访问但同时请求特定的变量?

java - 启用和禁用 eclipse 中的所有断点

mysql - 使用 MySQL 获取时间戳

消息系统的Mysql查询。一个我想不通的小错误

java - 如何用java读取我电脑中的所有mp3文件?