bytea type&nulls,Postgres

Tha*_*tos 2 postgresql

bytea在PostgreSQL中使用了一种类型,根据我的理解,它只包含一系列字节.但是,我无法让它与nulls一起发挥.例如:

=# select length(E'aa\x00aa'::bytea);
 length
--------
      2
(1 row)
Run Code Online (Sandbox Code Playgroud)

我期待着5.还:

=# select md5(E'aa\x00aa'::bytea);
               md5
----------------------------------
 4124bc0a9335c27f086f24ba207a4912
(1 row)
Run Code Online (Sandbox Code Playgroud)

这是"aa"的MD5,而不是"aa\x00aa".显然,我做错了,但我不知道我做错了什么.由于我无法控制的原因,我也使用旧版本的Postgres(8.1.11).(我回到家后,我会看到最新Postgres的表现是否相同......)

leo*_*loy 9

试试这个:

# select length(E'aa\\000aa'::bytea);
 length
--------
      5
Run Code Online (Sandbox Code Playgroud)

更新:原来为什么不起作用?首先,了解一个斜杠和两个斜杠之间的区别:

pg=# select E'aa\055aa', length(E'aa\055aa') ;
 ?column? | length
----------+--------
 aa-aa    |      5
(1 row)

pg=# select E'aa\\055aa', length(E'aa\\055aa') ;
 ?column? | length
----------+--------
 aa\055aa |      8
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我正在写一个文字字符串,4个字符未转义('a')和一个转义.解析器在第一次传递中使用斜杠,它将完整\055 转换为单个char(在本例中为" - ").

在第二种情况下,第一个斜杠只是逃避第二个斜杠,该对\\由解析器转换为单个\,并且055被视为三个字符.

现在,当将文本转换为bytea时,将再次解析/解释转义字符(在已经解析或生成的文本中)!(是的,这很令人困惑).

所以,当我写作

 select E'aa\000aa'::bytea;
Run Code Online (Sandbox Code Playgroud)

在第一次解析中,文字E'aa\000aa'被转换为内部文本,在第三个位置具有空字符(并且根据您的postgresql版本,空字符被解释为EOS,并且文本被假定为长度为2 - 或者在其他版本中抛出非法字符串错误).

相反,当我写作

 select E'aa\\000aa'::bytea;
Run Code Online (Sandbox Code Playgroud)

在第一次解析中,看到文字字符串"aa\000aa"(八个字符),并与文本对齐; 然后在转换为bytea时,它再次被解析,字符序列'\ 000'被解释为空字节.

IMO postgresql在这里很糟糕.