postgres 将字符串插入数字列 - 不会发生自动类型转换

Posted

技术标签:

【中文标题】postgres 将字符串插入数字列 - 不会发生自动类型转换【英文标题】:postgres insert string to numeric column - auto-typecast does not happen 【发布时间】:2016-04-27 08:09:25 【问题描述】:

postgres DB test1 中有一个表,其架构为:

我们使用spring框架jdbcTemplate插入数据如下:

Object[] params = "978","tour";

jdbcTemplate.update("insert into test1 values (?,?)", params);

但这给出了例外:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;错误的 SQL 语法 [插入 test1 值 (?,?)];嵌套异常是 org.postgresql.util.PSQLException:错误:列“id”是整数类型,但表达式的类型是字符变化 错误:列“id”是整数类型,但表达式是字符变化类型

这适用于通过隐式类型转换的 Oracle 数据库,但 postgres 似乎不能那样工作。

这可能是 postgres 驱动程序的问题吗?

一种解决方法是显式转换:

insert into test1 values (?::numeric ,?)

但是有没有更好的方法来进行转换,因为这似乎不是一个好的解决方案,因为有很多查询需要修改,而且还可能存在其他此类转换问题。

是否可以在 DB 级别设置一些参数来执行自动转换?

【问题讨论】:

【参考方案1】:

我们在这里找到了答案

Storing json, jsonb, hstore, xml, enum, ipaddr, etc fails with "column "x" is of type json but expression is of type character varying"

应该添加一个新的连接属性:

String url = "jdbc:postgresql://localhost/test";

属性 props = new Properties();

props.setProperty("user","fred");

props.setProperty("密码","secret");

props.setProperty("stringtype", "unspecified");

连接连接 = DriverManager.getConnection(url, props);

https://jdbc.postgresql.org/documentation/94/connect.html

"如果 stringtype 设置为未指定,参数将作为非类型值发送到服务器,服务器将尝试推断适当的类型。如果您有一个使用 setString() 的现有应用程序,这将很有用设置实际上是其他类型的参数,例如整数,并且您无法更改应用程序以使用适当的方法,例如 setInt()"

【讨论】:

【参考方案2】:

是的,把双引号放在这里:

Object[] params = "978","tour";

变成

Object[] params = 978,"tour";

或者按照你提到的那样做演员。

【讨论】:

感谢您的评论。是的,这行得通。但问题是有数千个查询需要修改,参数是从用户界面发送的,我们正在尝试将现有应用程序移植到 postgres。我们找到了另一种解决方案。贴在下面。 2021年,数值列,接受“50.5”或50.5等插入值

以上是关于postgres 将字符串插入数字列 - 不会发生自动类型转换的主要内容,如果未能解决你的问题,请参考以下文章

播放 Anorm 将 scala 列表插入到 postgres 文本数组列中

Spring Boot Hibernate 将数据插入 Postgres 中的错误列

Postgres 创建触发器函数以在允许插入之前将值从一列复制到另一列

Postgres: 如何在psql查询的字符串中插入双引号?

防止在 postgres 上的异步插入重复

Postgres - 冲突 - 如何知道是不是发生了更新而不是插入 [重复]