【问题标题】:postgres insert string to numeric column - auto-typecast does not happenpostgres 将字符串插入数字列 - 不会发生自动类型转换
【发布时间】: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 级别设置一些参数来执行自动转换?

【问题讨论】:

    标签: database postgresql casting jdbctemplate


    【解决方案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等插入值
      猜你喜欢
      • 2019-12-04
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      相关资源
      最近更新 更多