HDBC-postgreSQL bytea字段作为SqlByteString十六进制字符串返回

时间:2016-03-17 10:12:29

标签: postgresql haskell hdbc

当我使用HDBC-postgreSQL驱动程序(版本2.3.2.3)在Postgres数据库中选择填充二进制数据的**Solutions Count** Between 100-500 2 Between 500-1000 3 Between 1000-1500 3 Between 1500-2000 2 字段时,它们显示为:

bytea

也就是说,它返回一个SqlByteString "\x<hex representation of binary data>",其中包含一个包含ByteString的字符串,后跟我的二进制数据的十六进制表示。这很不方便,效率极低,对我来说基本没用。

是否有任何理由不返回包含字节字符串的\x,其中包含实际的二进制数据?是否有我遗漏的东西,或者我如何配置驱动程序来做到这一点?

感谢

2 个答案:

答案 0 :(得分:1)

这是该库的一个长期已知问题。例如,请参阅this bug

更广泛的问题是获取原始字节需要相当多的聪明才能使postgres api显而易见。你必须使用二进制而不是文本输出来调用整个查询(无论如何这可能更好,但需要重写绑定层的那一部分)。

你可以看到where pqexecparams is called并注意它的最后一个参数为0,postgres docs表示一切都以文本形式返回。对于postgres,这意味着你看到这个有趣的十六进制表示。

如果该参数被交换为1,那么事情可以更有效地完成(包括获取bytea字段的原始二进制文件)但是必须普遍重写Statement.hsc以反序列化这些二进制值。 / p>

这是其中一个对许多人有点刺激的事情之一,但是没有人有足够的动力来重写和调试整个事情。但是,当然,有人真的应该! : - )

答案 1 :(得分:1)

我已经解决了这个问题,转到postgresql.conf并添加:

bytea_output = 'escape' #by default, it's 'hex'

这个剂量是什么,它现在可以完全按照插入方式检索数据,因为输出不再被编码。

我知道现在已经很晚了,我也是Stack Overflow的新手,但我教这个信息很重要。