繁体   English   中英

NpgSql-使用解码功能从查询返回的错误数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM