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 创建触发器函数以在允许插入之前将值从一列复制到另一列