为什么PostgreSQL下对较长内容进行BASE64编码会产生多一个加号?

最近在折腾PostgREST的时候把用户密码用SHA512 hash之后在base64编码会迷之产生一个加号和换行。发现只要是对比较长的数据进行base64编码就会出现加号并换行,虽然知道某个RFC说Base64好像最多一行只能写78字符,但是明显换行的时候多了个加号,不过把结果重新decode之后的结果是没问题的。而且把有问题的结果丢node.js里面是解不出原来的数据的。。

例如:

frontier=> select encode('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890+/', 'base64');
                                    encode
------------------------------------------------------------------------------
 QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0+
 NTY3ODkwKy8=
(1 row)


frontier=> select decode(encode('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890+/', 'base64'), 'base64');
                                                                decode

--------------------------------------------------------------------------------------------------------------------------------------
 \x4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a30313233343536373839302b2f
(1 row)

pgsql不太熟悉,不知道怎么把bytea转回去,不过勉强能看出来跟原文是一致的。但是base64的结果跟node.js输出相比就会多出一个加号,而且加号后面换行了

-- pgSQL输出:
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0+
NTY3ODkwKy8=
-- Node.js输出:
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkwKy8=

Node.js解码结果:
图片描述

阅读 6.3k
1 个回答

加号是换行的提示(可以用psql的-A参数关闭),不是字符串内容的一部分,导致了误解。下面返回结果是空的:

select 1 where encode(
   'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890+/', 
   'base64') like '%+%'

可以用convert_from函数把bytea转成字符串:

select convert_from(decode(encode(
   'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890+/',
   'base64'), 'base64'),'UTF8')

`

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题