PostgreSQL错误42883-使用从字符串转换的整数时未定义函数
显然,PostgreSQL错误42883-使用从字符串转换的整数时未定义函数,postgresql,jdbc,Postgresql,Jdbc,显然, Select Message From "public".USERS Where ID = '1' 这是一份完美的法律声明。 也是如此 事实上,它们是一样的。两者之间的唯一区别是,第二个是最初 Select Message From "public".USERS Where ID = ? 并使用ID值1参数化 事实上,当我试图对要执行的语句进行硬编码时,一切都运行得很好,并且我收到了预期的输出 通过测试,我发现问题实际上是,如果参数最初是字符串,则没有问题。因此: Prepare
Select Message From "public".USERS Where ID = '1'
这是一份完美的法律声明。也是如此 事实上,它们是一样的。两者之间的唯一区别是,第二个是最初
Select Message From "public".USERS Where ID = ?
并使用ID值1参数化
事实上,当我试图对要执行的语句进行硬编码时,一切都运行得很好,并且我收到了预期的输出
通过测试,我发现问题实际上是,如果参数最初是字符串,则没有问题。因此:
PreparedStatement statement = connection.prepareStatement("Select * from table where ID = ?");
statement.setString(1, param);
如果param被声明为
String param = "1";
但如果您以任何其他方式申报,则不在此限。比如说,
String param = Integer.toString(1);
String param = String.valueOf(1);
String param = ""+1;
都会导致错误
我完全不知道a)是什么导致了这样一个特殊的错误,B)为什么即使将int转换为与字符串值完全相同的字符串,最初是int的字符串也会导致错误。当你说第二个查询“是一个PreparedStatement的结果,该语句用ID值1参数化了”您的意思是在指定参数值后,您对
PreparedStatement
对象执行了toString
?一些JDBC驱动程序允许它显示“有效”的SQL语句,但它们也可能具有欺骗性,因为发送到服务器的可能并不完全是这些语句。您可以尝试在服务器上登录(请参阅)以查看实际接收到的内容,以及您稍后描述的场景之间是否存在差异。我无法在Windows上使用postgresql 9.6.5中的“postgresql-42.1.4.jre7.jar”重现您的问题。您可能希望您的问题包括您正在使用的PostgreSQL和JDBC驱动程序的版本,以及运行应用程序的平台。看起来您的ID
列是一个varchar
/text
-在查询中强制转换如何,例如:SELECT*FROM table WHERE ID=?::text
String param = Integer.toString(1);
String param = String.valueOf(1);
String param = ""+1;