0

这可能是重复的,但在很长一段时间后我一直无法真正找出如何做到这一点。

我想要做的只是往返一个二进制值。我选择它,然后将其粘贴到另一个 SQL 查询中。

IE

  • 我有一个有列的表id, data
  • 我在 Azure Data Studio 中使用 postgres 扩展运行此查询:select id, data from mytable
  • 输出窗口显示了这个
id  data
58  b'\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC'

现在我正在尝试做第二个查询,我计算与那个匹配的东西。

select count(*) from mytable where data = b'\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC'

我收到错误消息“\”不是有效的二进制数字

我发现的大多数文档和其他东西似乎都建议使用E'...'::bytea语法,所以我这样做:

select count(*) from mytable where data = E'\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC'::bytea

我收到错误消息invalid byte sequence for encoding "UTF8": 0xaa

我已经尝试过该decode功能,因为其他事情表明:

select count(*) from mytable where data = decode('\xaa\xb6\x87|-x\xf6\xd1\x80\xec\xd2\xed\x91\x1ebd\x924g\xcd\xaeVZ\x01\xf2\xa0\xb3\xd8\x16\xe1fC', 'escape')

并且失败,错误类型为 bytea 的输入语法无效

为什么二进制数据的输出格式不是有效的输入格式?希望这不仅仅是 Azure Data Studio 奇怪 :-(

4

2 回答 2

1

使用十六进制值时,decode()您需要使用该hex选项并仅提供有效的十六进制数字:

decode('aab687', 'hex')

或者,您可以在十六进制值前面加上一个 \x例如

'\xaab687'::bytea

但是,您的字符串包含无效的十六进制值,例如\x1ebd\x924g并且\x87|-x- 不确定应该是什么。

“转义”语法(例如使用E'...')需要八进制,而不是十六进制数字,所以E'\xaa\xb6...应该是E'\\252\\266.... 使用'escape'选项时也是如此decode()

于 2020-03-29T11:00:48.683 回答
0

事实证明这是 Azure Data Studio 的行为,而不是特定于 postgresql。

当我使用运行相同的查询时,psql我得到一个格式合理的十六进制字符串,它在往返查询中工作正常,看起来像\xbc6b702a12f8adb482ad517eca5af6407c9f172091242aa79845a17b4d479e2d(注意不同的数据值,但格式是正确的)

我针对 Azure Data Studio 的 postgresql 插件提出了问题,希望可以通过这种方式解决。

问题链接:https ://github.com/microsoft/azuredatastudio-postgresql/issues/204

作为一种解决方法,我需要select encode(column, 'hex')在所有查询中使用

于 2020-03-29T21:07:48.790 回答