HDBC-postgreSQL bytea 字段作为 SqlByteString 十六进制字符串返回
HDBC-postgreSQL bytea fields get returned as SqlByteString hex strings
当我使用 HDBC-postgreSQL 驱动程序(版本 2.3.2.3)在我的 Postgres 数据库中 select bytea
字段填充二进制数据时,它们显示为:
SqlByteString "\x<hex representation of binary data>"
也就是说,它 return 是一个 ByteString
,其中包含一个包含 \x
的字符串,后跟我的二进制数据的十六进制表示形式。这很不方便,效率极低,对我来说基本上没有意义。
为什么它不 return 一个 SqlByteString
包含一个包含实际二进制数据的字节字符串?有没有我遗漏的东西,或者我如何配置驱动程序来做到这一点?
谢谢
这是该库的一个长期已知问题。例如,参见 this bug。
更广泛的问题是获取原始字节需要相当多的聪明才智,而 postgres api 并不明显。您必须使用二进制而不是文本输出来调用整个查询(无论如何,这可以说更好,但需要重写绑定层的那部分)。
你可以看到 where pqexecparams is called and note it is called with a last parameter of 0, which by the postgres docs 意味着一切都以文本形式返回。对于 postgres,这意味着您会看到这个有趣的十六进制表示。
如果该参数被交换为 1,那么事情可以更有效地完成(包括为 bytea
字段获取原始二进制文件)但是 Statement.hsc
必须普遍重写以反序列化这些二进制值.
这是让很多人有点恼火的事情之一,但还没有人有足够的动力去重写和调试整个事情。但是,当然,有人真的应该这样做! :-)
我已经解决了 postgresql.conf 并添加:
bytea_output = 'escape' #by default, it's 'hex'
这是什么意思,它现在可以完全按照您插入数据的方式检索数据,因为输出不再经过编码。
我知道已经晚了,我也是 Stack Overflow 的新手,但我教导说这些信息很重要。
当我使用 HDBC-postgreSQL 驱动程序(版本 2.3.2.3)在我的 Postgres 数据库中 select bytea
字段填充二进制数据时,它们显示为:
SqlByteString "\x<hex representation of binary data>"
也就是说,它 return 是一个 ByteString
,其中包含一个包含 \x
的字符串,后跟我的二进制数据的十六进制表示形式。这很不方便,效率极低,对我来说基本上没有意义。
为什么它不 return 一个 SqlByteString
包含一个包含实际二进制数据的字节字符串?有没有我遗漏的东西,或者我如何配置驱动程序来做到这一点?
谢谢
这是该库的一个长期已知问题。例如,参见 this bug。
更广泛的问题是获取原始字节需要相当多的聪明才智,而 postgres api 并不明显。您必须使用二进制而不是文本输出来调用整个查询(无论如何,这可以说更好,但需要重写绑定层的那部分)。
你可以看到 where pqexecparams is called and note it is called with a last parameter of 0, which by the postgres docs 意味着一切都以文本形式返回。对于 postgres,这意味着您会看到这个有趣的十六进制表示。
如果该参数被交换为 1,那么事情可以更有效地完成(包括为 bytea
字段获取原始二进制文件)但是 Statement.hsc
必须普遍重写以反序列化这些二进制值.
这是让很多人有点恼火的事情之一,但还没有人有足够的动力去重写和调试整个事情。但是,当然,有人真的应该这样做! :-)
我已经解决了 postgresql.conf 并添加:
bytea_output = 'escape' #by default, it's 'hex'
这是什么意思,它现在可以完全按照您插入数据的方式检索数据,因为输出不再经过编码。
我知道已经晚了,我也是 Stack Overflow 的新手,但我教导说这些信息很重要。