gpt4 book ai didi

postgresql - bytea 类型和空值,Postgres

转载 作者:行者123 更新时间:2023-11-29 11:53:27 26 4
gpt4 key购买 nike

我在 PostgreSQL 中使用 bytea 类型,据我所知,它只包含一系列字节。但是,我无法让它与 null 一起玩。例如:

=# select length(E'aa\x00aa'::bytea);
length
--------
2
(1 row)

我期待 5。另外:

=# select md5(E'aa\x00aa'::bytea);
md5
----------------------------------
4124bc0a9335c27f086f24ba207a4912
(1 row)

那是“aa”的MD5,不是“aa\x00aa”。显然,我做错了,但我不知道我做错了什么。由于我无法控制的原因,我还在使用旧版本的 Postgres (8.1.11)。 (我一回家就看看这在最新的 Postgres 上是否表现相同......)

最佳答案

试试这个:

# select length(E'aa\\000aa'::bytea);
length
--------
5

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

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

在第一种情况下,我正在编写一个文字字符串,4 个字符未转义('a'),一个转义。解析器在第一遍中使用斜线,将完整的 \055 到单个字符(在本例中为“-”)。

在第二种情况下,第一个斜杠正好转义了第二个斜杠,\\ 对被解析器翻译成单个 \055 被视为三个字符。

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

所以,当我写的时候

 select E'aa\000aa'::bytea;

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

相反,当我写

 select E'aa\\000aa'::bytea;

在第一次解析中,看到了文字串“aa\000aa”(八个字符),并赋给了一个文本;然后在转换为 bytea 时,再次解析,字符序列 '\000' 被解释为空字节。

IMO postgresql 有点糟糕。

关于postgresql - bytea 类型和空值,Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2991840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com