检索MetaData“select ... limit?,?”时的MySQLSyntaxErrorException准备好查询

时间:2011-05-26 12:23:33

标签: 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时,代码工作得很好。 我在互联网和bug数据库中找不到任何提到的bug。

我尝试过以下版本的connector / J:5.1.14,5.1.12,5.1.9(Maven依赖)。

服务器版本为5.0.77

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

这是因为当你执行“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