如何使用 Azure Data Studio 将转义字符串转换为 postgresql 中的 bytea(\ 不是二进制数字)
How can I convert an escaped string to a bytea in postgresql (\ is not a binary digit) with Azure Data Studio
这可能是重复的,但我在相当长一段时间后一直无法真正找到如何做到这一点。
我想做的只是往返一个二进制值。我 select 它,然后将其粘贴到另一个 SQL 查询中。
即
- 我有一个 table 列
id, data
- 我 运行 在 Azure Data Studio 中使用 postgres 扩展进行此查询:
select id, data from mytable
- 输出 window 显示了这个
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
我收到错误消息 编码字节序列无效 "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')
失败并显示错误 invalid input syntax for type bytea
为什么二进制数据的输出格式不是有效的输入格式?
希望这不仅仅是 Azure Data Studio 很奇怪:-(
在 decode()
中使用十六进制值时,您需要使用 hex
选项并仅提供有效的十六进制数字:
decode('aab687', 'hex')
或者,您可以在十六进制值前面加上 single \x
,例如
'\xaab687'::bytea
但是您的字符串包含无效的十六进制值,例如\x1ebd
、\x924g
和 \x87|-x
- 不确定应该是什么。
"escape" 语法(例如使用 E'...'
)需要 octal values,而不是十六进制数,因此 E'\xaa\xb6...
应该是 E'\252\266...
。对 decode()
使用 'escape'
选项时也是如此
事实证明这是 Azure Data studio 的行为,而不是 postgresql 特有的行为。
当我 运行 使用 psql
相同的查询时,我得到一个合理格式化的十六进制字符串,它在往返查询中工作正常,看起来像 \xbc6b702a12f8adb482ad517eca5af6407c9f172091242aa79845a17b4d479e2d
(注意不同的数据值,但格式正确)
我针对 Azure Data Studio 的 postgresql 插件提交了一个问题,希望它可以通过这种方式得到解决。
问题Link:https://github.com/microsoft/azuredatastudio-postgresql/issues/204
作为解决方法,我需要在所有查询中使用 select encode(column, 'hex')
这可能是重复的,但我在相当长一段时间后一直无法真正找到如何做到这一点。
我想做的只是往返一个二进制值。我 select 它,然后将其粘贴到另一个 SQL 查询中。
即
- 我有一个 table 列
id, data
- 我 运行 在 Azure Data Studio 中使用 postgres 扩展进行此查询:
select id, data from mytable
- 输出 window 显示了这个
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
我收到错误消息 编码字节序列无效 "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')
失败并显示错误 invalid input syntax for type bytea
为什么二进制数据的输出格式不是有效的输入格式? 希望这不仅仅是 Azure Data Studio 很奇怪:-(
在 decode()
中使用十六进制值时,您需要使用 hex
选项并仅提供有效的十六进制数字:
decode('aab687', 'hex')
或者,您可以在十六进制值前面加上 single \x
,例如
'\xaab687'::bytea
但是您的字符串包含无效的十六进制值,例如\x1ebd
、\x924g
和 \x87|-x
- 不确定应该是什么。
"escape" 语法(例如使用 E'...'
)需要 octal values,而不是十六进制数,因此 E'\xaa\xb6...
应该是 E'\252\266...
。对 decode()
'escape'
选项时也是如此
事实证明这是 Azure Data studio 的行为,而不是 postgresql 特有的行为。
当我 运行 使用 psql
相同的查询时,我得到一个合理格式化的十六进制字符串,它在往返查询中工作正常,看起来像 \xbc6b702a12f8adb482ad517eca5af6407c9f172091242aa79845a17b4d479e2d
(注意不同的数据值,但格式正确)
我针对 Azure Data Studio 的 postgresql 插件提交了一个问题,希望它可以通过这种方式得到解决。
问题Link:https://github.com/microsoft/azuredatastudio-postgresql/issues/204
作为解决方法,我需要在所有查询中使用 select encode(column, 'hex')