文档

二进制数据类型

更新时间:

本文介绍了二进制数据类型的定义及相关语法。

名称

存储大小

说明

BINARY

二进制字符串的长度。

定长二进制字符串,取值范围:1~8300。

BLOB

实际二进制字符串加1字节(如果二进制字符串小于127字节)或4字节(如果二进制字符串大于等于127字节)。

可变长度的二进制字符串。

VARBINARY

二进制字符串的长度。

可变长度的二进制字符串,取值范围:1~8300。

BYTEA

1或4字节加上实际的二进制字符串。

变长的二进制字符串。

二进制串是一个八位位组(或字节)的序列。 二进制串和字符串的区别有两个: 首先,二进制串明确允许存储零值的字节以及其它“不可打印的”字节(通常是位于十进制范围 32 到 126 之外的字节)。 字符串不允许零字节,并且也不允许那些对于数据库的选定字符集编码是非法的任何其它字节值或者字节值序列。 第二,对二进制串的操作会处理实际上的字节,而字符串的处理和取决于区域设置。 简单说,二进制字串适用于存储那些程序员认为是“裸字节”的数据,而字符串适合存储文本。

bytea类型支持两种用于输入和输出的格式:“十六进制”格式和“转义”格式。在输入时这两种格式总是会被接受。输出格式则取决于配置参数 bytea_output,其默认值为十六进制。

SQL 标准定义了一种不同的二进制串类型, 叫做BLOB或者BINARY LARGE OBJECT。其输入格式和bytea不同,但是提供的函数和操作符大多一样。

bytea的十六进制格式

“十六进制”格式将二进制数据编码为每个字节 2 个十六进制位,最高有效位在前。整个串以序列\x开头(用以和转义格式区分)。在某些情景中,开头的反斜线可能需要通过双写来转义。 作为输入,十六进制位可以是大写也可以是小写,在位对之间可以有空白(但是在位对内部以及开头的\x序列中不能有空白)。十六进制格式和很多外部应用及协议相兼容,并且其转换速度要比转义格式更快,因此人们更愿意用它。

例子:

    select '\xDEADBEEF';

bytea的转义格式

“转义”格式是bytea类型的传统格式。它采用将二进制串表示成 ASCII 字符序列的方法,而将那些无法用 ASCII 字符表示的字节转换成特殊的转义语句。从应用的角度来看,如果将字节表示为字符有意义,那么这种表示将很方便。但是在实际中,这常常是令人困扰的,因为它使二进制串和字符串之间的区别变得模糊,并且这种特别的转义机制也有点难于处理。因此这种格式可能会在大部分新应用中避免使用。

在转义模式下输入bytea值时,某些值的字节必须被转义,而所有的字节值都可以被转义。通常,要转义一个字节,需要把它转换成与它的三位八进制值, 并且前导一个反斜线。反斜线本身(十进制字节值 92)也可以用双写的反斜线表示。

bytea文字转义字节

十进制字节值

描述

转义输入表示

例子

十六进制表示

0

0字节

'\000'

'\000'::bytea

\x00

39

单引号

'''''\047'

''''::bytea

\x27

92

反斜线

'\\''\134'

'\\'::bytea

\x5c

0到31和127到255

“不可打印的”字节

'\xxx'(八进制值)

'\001'::bytea

\x01

转义“不可打印的”字节的要求取决于区域设置。在某些实例中,你可以不理睬它们,让它们保持未转义的状态。

单引号必须写两次对任何 SQL 命令中的字符串常量都是一样的。 文字解析器消耗最外层的单引号,并缩减成对的单引号为一个普通数据字符。 bytea输入函数看到的只是一个单引号,它将其视为普通数据字符。 但是,bytea输入函数将反斜杠视为特殊字符。

在某些情况下,反斜杠必须加倍,如上所示,因为通用的字符串文字解析器也会将一对反斜杠减少为一个数据字符。

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

    set bytea_output = 'escape';

    select 'abc \153\154\155 \052\251\124'::bytea;
         bytea
    ----------------
     abc klm *\251T

十进制值为 92(反斜线)的字节在输出时被双写。

bytea输出转义字节

十进制字节值

描述

转义的输出表示

例子

输出结果

92

反斜线

\\

'\134'::bytea

\\

0到31和127到255

“不可打印的”字节

\xxx(八进制值)

'\001'::bytea

\001

32到126

“可打印的”字节

客户端字符集表示

'\176'::bytea

~

根据你使用的前端,你在转义和未转义bytea串方面可能需要做额外的工作。例如,如果你的接口自动翻译换行和回车,你可能也不得不转义它们。

BINARY和VARBINARY

数据BINARY类型为固定长度的二进制值,长度为N字节,N的取值范围为:1~8300字节。

数据BINARY类型需要N字节存储。数据用尾随零填充到最大列大小。

数据VARBINARY类型是具有最大字节长度的变长二进制值N,N的取值范围为:1~4194304字节。

示例

create table bvar (col1 BINARY (10), col2 VARBINARY (10));
create table t (col1 BINARY(10), COL2 VARBINARY(10));
insert into t values('0x4D795','0x39274D');
select * from t;
    col1    |   col2   
------------+----------
 0x4D795    | 0x39274D
(1 row)

BLOB

BLOB数据类型存储非结构化二进制大对象。BLOB数据的最大大小为16 MB。

在列中定义BLOB时,不需要定义VARBINARY或者其它可变长度数据类型那样定义最大字符数。相反,该列的定义如下:

create table blob_content ( 
  id NUMBER PRIMARY KEY, 
  blob_column BLOB );

为了操作BLOB,提供了以下函数:

  • 有两种初始化BLOB类型数据的方法,一种是使用EMPTY_BLOB函数来初始化空的BLOB类型数据,另一种是直接插入数据到表中

  • 如需将二进制值转换为BLOB类型,请使用TO_LOBTO_BLOB函数。