首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bytea类型& nulls,Postgres

bytea类型& nulls,Postgres
EN

Stack Overflow用户
提问于 2010-06-08 01:45:53
回答 2查看 6.5K关注 0票数 2

我在PostgreSQL中使用bytea类型,据我所知,它只包含一系列字节。但是,我不能让它很好地使用空值。例如:

代码语言:javascript
复制
=# select length(E'aa\x00aa'::bytea);
 length
--------
      2
(1 row)

我还以为有5个呢。还有:

代码语言:javascript
复制
=# select md5(E'aa\x00aa'::bytea);
               md5
----------------------------------
 4124bc0a9335c27f086f24ba207a4912
(1 row)

这是"aa“的MD5,不是”aax00aa“。很明显,我做错了,但我不知道我做错了什么。由于我无法控制的原因,我也在使用旧版本的Postgres (8.1.11)。(我一到家就会看看这在最新的Postgres上是否有同样的表现…)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-08 01:55:57

试试这个:

代码语言:javascript
复制
# select length(E'aa\\000aa'::bytea);
 length
--------
      5

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

代码语言:javascript
复制
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!(是的,这是令人困惑的)。

所以,当我写下

代码语言:javascript
复制
 select E'aa\000aa'::bytea;

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

相反,当我写下

代码语言:javascript
复制
 select E'aa\\000aa'::bytea;

在第一次解析中,可以看到文字字符串"aa\000aa“(8个字符),并将其赋给一个文本;然后,在转换为bytea时,再次解析它,并将字符序列'\000‘解释为空字节。

在这里,IMO postgresql有点糟糕。

票数 9
EN

Stack Overflow用户

发布于 2019-03-07 22:38:21

您可以使用常规字符串或美元引号字符串来代替转义字符串:

代码语言:javascript
复制
# select length('aa\000aa'::bytea);
 length 
════════
      5
(1 row)

# select length($$aa\000aa$$::bytea);
length 
════════
      5
(1 row)

我认为美元加引号的字符串是一个更好的选择,因为如果配置参数standard_conforming_strings为off,那么PostgreSQL可以识别常规字符串常量和转义字符串常量中的反斜杠转义。但是,从PostgreSQL 9.1开始,缺省值为on,这意味着只能在转义字符串常量中识别反斜杠转义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2991840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档