[英]NpgSql - bad data returned from query with decode function
我目前正在开始将应用程序的Postgres 8.4 db升级到9.4的过程。 实际的数据库迁移已完美完成,但是在针对9.4 DB运行时,一些应用程序查询没有返回奇怪的结果。 我正在使用C#的NpgSql v2.0.12.0库。 该问题似乎与几个表有关,这些表存储了编码为base64字符串的文本数据。 查询调用postgres解码函数,以将编码后的数据作为纯文本返回。 例如:
SELECT
decode(user_name, 'base64')::text as user_name
FROM
login
WHERE
login_id = 123;
当提交给8.4 DB时,字符串将正确返回给应用程序。 当提交到9.4 DB时,我得到
\x61646d696e6973747261746f72
在两种情况下,在PgAdmin SQL工具中结果都是正确的。 我确定这可能是某种编码问题,但我一生都无法解决-我已经搜索了数小时,浏览了postgres文档,并在此进行了无休止的搜索,最终未能找到一个解决我的问题。 希望那里有一些PostGres家伙可以向我指出正确的方向来解决此问题。
您一直依赖于按当前编码将bytea
输出解释为字符串,即您的代码始终是错误的,但确实起作用了。
较早的PostgreSQL版本对bytea文字使用“转义”格式,对于7位ASCII字符看起来像纯文本,对不可打印和8位字符使用八进制转义,例如
test=> SET bytea_output = 'escape';
SET
test=> SELECT convert_to('administrator á
', 'utf-8');
convert_to
----------------------------
administrator \303\241\012
(1 row)
更高的PostgreSQL版本默认为'hex'输出,它将所有内容编码为十六进制:
test=> SET bytea_output = 'hex';
SET
test=> SELECT convert_to('administrator á
', 'utf-8');
convert_to
--------------------------------------
\x61646d696e6973747261746f7220c3a10a
(1 row)
因此,您的应用无法再假设bytea是文本了。
如果base64字符串是当前本地文本编码中的有效文本,则可以使用convert_from(decode(user_name, 'base64'), 'utf-8')
。 但是在那种情况下,您应该将其存储为普通text
而不是首先进行base64编码。
如果以base64字符串不是在目前的编码有效,例如,它包含空字节,不能在代表字符client_encoding
,等等,那么你就应该返回十六进制或Base64表示,它在客户端应用程序进行解码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.