设置时间戳会引发 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的主要内容,如果未能解决你的问题,请参考以下文章
使用云功能时,来自 Firestore 的时间戳会转换为地图
将 pandas DataFrame 和 xaxis 绘制为时间戳会产生空图