【问题标题】:Postgresql 9.5 Syntax errorPostgresql 9.5 语法错误
【发布时间】:2016-07-03 23:47:51
【问题描述】:

我在两个具有不同 postgres 版本的服务器上执行相同的 sql 脚本。第一个安装了 postgres 9.4.4(这工作正常),另一个安装了 9.5(这会引发异常)。

UPDATE archived_invoice SET encrypted_xml 
= encrypt(xml::bytea, 'MySuperSecretKey'::bytea, 'aes-ecb/pad:pkcs')

例外:

Caused by: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type bytea
SQL Status:22P02

这两个 postgresql 版本有什么不同吗?

【问题讨论】:

  • 可能您的standard_conforming_strings 在系统之间有所不同,这导致对反斜杠的不同解释。无论如何,您应该使用 convert_to() 函数从文本中获取字节,而不是强制转换为 bytea。演员对转义序列进行解释,这在这里完全不符合要求。

标签: postgresql postgresql-9.4 postgresql-9.5


【解决方案1】:

如果您要转换为 byteatext 包含无效的转义序列,PostgreSQL 将向您抛出 ERROR: invalid input syntax for type bytea

# select '\i is not a valid escape sequence'::bytea;
ERROR:  invalid input syntax for type bytea
LINE 1: select '\i is not a valid escape sequence'::bytea;

我猜您的“xml”列包含或可能包含一些反斜杠。这适用于 XML 和 text 列,但在转换为 bytea 时会出现问题。

您需要转义反斜杠:

UPDATE archived_invoice SET encrypted_xml 
= encrypt(
    replace(xml, '\', '\\')::bytea,
    'MySuperSecretKey'::bytea,
    'aes-ecb/pad:pkcs'
)

【讨论】:

  • 它有效,谢谢!这真的很奇怪。我的脚本在 Windows 上运行,但不在 ubuntu 上运行。为什么会出现这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2021-09-03
  • 1970-01-01
  • 2016-12-05
  • 2017-12-11
  • 2010-12-26
  • 2018-04-05
相关资源
最近更新 更多