二进制数据类型

bytea 数据类型允许存储二进制串。

名字 存储尺寸 描述
bytea 1 或 4 字节外加真正的二进制串 变长二进制串

bytea 类型支持两种用于输入和输出的格式:“十六进制”格式和瀚高数据库的历史的“转义”格式。在输入时这两种格式总是会被接受,输出格式则取决于配置参数 bytea_output,其默认值为十六进制。“十六进制”格式将二进制数据编码为每个字节 2 个十六进制位,最高有效位在前,整个串以序列 \x 开头(用以和转义格式区分)。作为输入,十六进制位可以是大写也可以是小写,在位对之间可以有空白。

例如下面是一个十六进制格式。

SELECT '\xDEADBEEF';

“转义”格式是 bytea 类型的传统瀚高数据库格式,将二进制串表示成 ASCII 字符序列。通常,要转义一个字节,需要把它转换成它的三位八进制值,前导一个反斜线。反斜线本身可以双写来进行表示。

下表给出了必须被转义的字符及替代转义序列:

十进制字节值 描述 转义输入表示 例子 十六进制表示
0 0字节 ‘\000’ SELECT ‘\000’::bytea; \x00
39 单引号 ‘’’’或’\047’ SELECT ‘’’’::bytea; \x27
92 反斜线 ‘\‘或’\134’ SELECT ‘\‘::bytea; \x5c
0到31和127到255 “不可打印”字节 ‘\xxx’(八进制值) SELET ‘\001’::bytea; \x01

Bytea 字节默认被输出为 hex 格式。如果你把 bytea_output 改为 escape ,“不 可打印的”字节会被转换成与之等效的三位八进制值并且前置一个反斜线。大部 分“可打印的”字节被输出为它们在客户端字符集中的标准表示形式,例如:

SET bytea_output = 'escape';
SELECT 'abc \153\154\155 \052\251\124'::bytea;
bytea


abc klm *\251T

十进制值为 92(反斜线)的字节在输出时被双写。详情请见表 7.8。

表 7.8 bytea 输出转义字节

十进制字节值 描述 转义输入表示 例子 输出结果
92 反斜线 \ SELECT’\134’::bytea; \
0 到 31 和 127 到 255 “不可打印 的”字节 \xxx(八进制 值) SELECT’\001’::bytea; \001
32 到 126 “可打印 的”字节 表示客户端字符集 SELECT’\176’::bytea;

二进制串和字符串的区别有两个:

首先,二进制串明确允许存储零值的字节以及其它“不可打印的”字节(通常是位于十进制范围 32 到 126 之外的字节)。 字符串不允许零字节,并且也不允许那些对于数据库的选定字符集编码是非法的任何其它字节值或者字节值序列。

其次,对二进制串的操作会处理实际上的字节,而字符串的处理取决于区域设置。 简单说,二进制字串适用于存储那些程序员认为是“裸字节”的数据,而字符串适合存储文本。