设置时间戳会引发 PSQLException:不支持的类型值:2,013

Posted

技术标签:

【中文标题】设置时间戳会引发 PSQLException:不支持的类型值:2,013【英文标题】:Setting a timestamp throws PSQLException: Unsupported Types value: 2,013 【发布时间】:2016-06-14 02:37:11 【问题描述】:

我使用的是最新的 Postgres 版本,但如果我调用 registerSQLType(paramName, Types.TIME_WITH_TIMEZONE),它仍然会引发 Unsupported type 异常。我可以在 Spring 配置中为 postgres 数据源设置 stringtype=unspecified,并通过将参数作为 ISO 格式的字符串传递来解决此问题。

但是,我正在尝试使用 EmbeddedPostgres(来自 OpenTable Embedded PostgreSQL Component)为我的数据访问层编写功能测试,因为这些测试将在 AWS 中运行而无需访问 RDS 实例。不幸的是,解决方法不起作用,因为 EmbeddedPostgres 在设置 stringtype 时窒息。

EmbeddedPostgres.builder().setServerConfig("stringtype", "unspecified").start();
// throws FATAL:  unrecognized configuration parameter "stringtype"

有人知道这两个障碍中的任何一个的解决方法吗?要么让 Postgres 显式接受时间戳,要么让 EmbeddedPostgres 采用 stringtype 参数(根据documentation,它应该是有效的)。

谢谢!

【问题讨论】:

那么抛出​​错误的Java代码是什么?您使用的 SQL 语句是什么? 【参考方案1】:

好的,经过一番努力,我找到了解决这两个问题的方法。我会把它们贴在这里,以防其他人遇到同样的问题。

对于第一个问题:

parameters.registerSqlType(EVENT_DATE, Types.TIMESTAMP_WITH_TIMEZONE);
//throws "PSQLException: Unsupported Types value: 2,013," 

我发现即使我设置了一个直接的 Timestamp 对象,Postgres 也会正确设置该值,只要我使用纪元时间值创建它。所以这行得通:

parameters.registerSqlType(EVENT_DATE, Types.TIMESTAMP);
java.sql.Timestamp sqlTS = new Timestamp(evt.getEventDate().toEpochMilli());
parameters.addValue(EVENT_DATE, sqlTS);

关于第二个问题——在 EmbeddedPostgres 上设置配置参数,我意识到我正在设置服务器配置参数,而我需要的是一个连接参数。

这是无效的代码:

EmbeddedPostgres pg = EmbeddedPostgres.builder().setServerConfig("stringtype", "unspecified").start();
// throws FATAL:  unrecognized configuration parameter "stringtype"
DataSource source = pg.getPostgresDatabase();

但这确实有效:

EmbeddedPostgres pg = EmbeddedPostgres.builder().start();
Properties props = new Properties();
props.setProperty("stringtype","unspecified");
Connection conn = DriverManager.getConnection(pg.getJdbcUrl("postgres", "postgres"), props);
DataSource source = new SingleConnectionDataSource(conn, false);

因此,如果您需要设置任何特定于 postgres 的连接参数,您只需要滚动您自己的 DataSource。

希望对某人有所帮助!

【讨论】:

以上是关于设置时间戳会引发 PSQLException:不支持的类型值:2,013的主要内容,如果未能解决你的问题,请参考以下文章

django,python为啥本地化后时间戳会发生变化

使用云功能时,来自 Firestore 的时间戳会转换为地图

将日光节约时间字符串转换为时间戳会产生错误的结果

将 pandas DataFrame 和 xaxis 绘制为时间戳会产生空图

org.postgresql.util.PSQLException:错误:由于事务之间的读/写依赖关系,无法序列化访问

Heroku 上的 PSQLException