8.4. 二进制数据类型

bytea数据类型允许存储二进制字符串。参见Table 8.6

表 8.6. 二进制数据类型

NameStorage SizeDescription
bytea1 或 4 个字节加上实际的二进制字符串可变长度二进制字符串

二进制字符串是八位字节(或字节)的序列。二进制字符串与字符串有两种区别。首先,二进制字符串专门允许存储值为零的八位位组和其他“不可打印的”八位位组(通常,十进制范围在 32 到 126 之间的八位位组)。字符串不允许使用零个八位字节,也不允许根据数据库的所选字符集编码而无效的任何其他八位字节值和八位字节值序列。其次,对二进制字符串的操作将处理实际的字节,而对字符串的处理则取决于语言环境设置。简而言之,二进制字符串适合于存储程序员认为是“原始字节”的数据,而字符串适合于存储文本。

bytea类型支持两种 Importing 和输出格式:“十六进制”格式和 PostgreSQL 的历史“转义”格式。这两个 Importing 始终被接受。输出格式取决于配置参数bytea_output;默认值为十六进制。 (请注意,十六进制格式是 PostgreSQL 9.0 中引入的;较早的版本和某些工具不了解.)

SQL 标准定义了另一种二进制字符串类型,称为BLOBBINARY LARGE OBJECT。Importing 格式与bytea不同,但是提供的函数和运算符基本相同。

8 .4.1. bytea 十六进制格式

“ hex”格式将二进制数据编码为每个字节 2 个十六进制数字,最高有效位在前。整个字符串的开头是序列\x(以将其与转义格式区分开)。在某些情况下,可能需要通过将初始反斜杠加倍来对其进行转义(请参见Section 4.1.2.1)。对于 Importing,十六进制数字可以是大写或小写,并且在数字对之间允许空格(但在数字对之内或在开始的\x序列中均不允许)。十六进制格式与多种外部应用程序和协议兼容,并且其转换速度通常比转义格式更快,因此首选使用。

Example:

SELECT '\xDEADBEEF';

8 .4.2. bytea 转义格式

“转义”格式是bytea类型的传统 PostgreSQL 格式。它采用将二进制字符串表示为 ASCII 字符序列的方法,同时将那些无法表示为 ASCII 字符的字节转换为特殊的转义序列。如果从应用程序的角度来看,将字节表示为字符是有意义的,那么这种表示方式将很方便。但是实际上,这通常会造成混淆,因为它模糊了二进制字符串和字符串之间的区别,而且所选择的特定转义机制有些笨拙。因此,对于大多数新应用程序,应避免使用这种格式。

当以转义格式 Importingbytea值时,必须转义某些值的八位字节,而可以*转义所有八位字节的值。通常,要转义八位字节,请将其转换为三位数的八进制值,并在其前加反斜杠。反斜杠本身(八位字节十进制值 92)也可以用双反斜杠表示。 Table 8.7显示必须转义的字符,并在适用时提供其他转义序列。

表 8.7. bytea逸出八位字节

十进制八位字节值Description转义的 Importing 表示ExampleHex Representation
0zero octet'\000'SELECT '\000'::bytea;\x00
39single quote'''''\047'SELECT ''''::bytea;\x27
92backslash'\\''\134'SELECT '\\'::bytea;\x5c
0 至 31 和 127 至 255"non-printable" octets'\xxx'(八进制值)SELECT '\001'::bytea;\x01

不可打印八位字节进行转义的要求取决于语言环境设置。在某些情况下,您可以使它们保持原样。

Table 8.7所示,单引号必须加倍的原因是,这对于 SQL 命令中的任何字符串 Literals 都是正确的。通用字符串 Literals 解析器使用最外面的单引号,并将任何一对单引号都减少为一个数据字符。 byteaImporting 函数所看到的只是一个单引号,它将其视为纯数据字符。但是,byteaImporting 函数将反斜杠视为特殊字符,而Table 8.7中所示的其他行为则由该函数实现。

在某些情况下,与上面显示的相比,反斜杠必须加倍,因为通用的字符串 Literals 分析器还将把反斜杠对减少为一个数据字符。参见Section 4.1.2.1

默认情况下,以hex格式输出Bytea个字节。如果将bytea_output更改为escape,则“不可打印的”八位字节将转换为等效的三位数八进制值,并以一个反斜杠开头。大多数“可打印的”八位位组均以其在 Client 端字符集中的标准表示形式输出,例如:

SET bytea_output = 'escape';

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

在输出中,十进制值 92(反斜杠)的八位字节加倍。详细信息在Table 8.8中。

表 8.8. bytea输出转义八位字节

十进制八位字节值Description转义输出表示ExampleOutput Result
92backslash\\SELECT '\134'::bytea;\\
0 至 31 和 127 至 255"non-printable" octets\xxx(八进制值)SELECT '\001'::bytea;\001
32 至 126"printable" octetsClient 字符集表示SELECT '\176'::bytea;~

根据所使用的 PostgreSQL 的前端,可能需要对转义和不转义bytea字符串进行其他工作。例如,如果您的界面自动翻译了换行符和回车符,则可能还必须转义它们。