名字 | 存储大小 | 描述 |
---|---|---|
bytea | 1 或 4 个字节加上实际的二进制字符串 | 可变长度二进制字符串 |
二进制字符串是八位字节(或字节)的序列。二进制字符串与字符串的区别有两种。首先,二进制字符串专门允许存储值为零的八位字节和其他“不可打印”的八位字节(通常是十进制范围 32 到 126 之外的八位字节)。字符串不允许零个八位字节,并且还不允许任何其他八位字节值和根据数据库所选字符集编码无效的八位字节值序列。其次,对二进制字符串的操作处理实际字节,而字符串的处理取决于区域设置。简而言之,二进制字符串适用于存储程序员认为为“原始字节”的数据,而字符串适用于存储文本。
该类型支持两种输入和输出格式:“十六进制”格式和 PostgreSQL 的历史“转义”格式。这两者在输入时始终被接受。输出格式取决于配置参数 bytea_output;默认值为十六进制。(请注意,十六进制格式是在 PostgreSQL 9.0 中引入的;早期版本和某些工具无法理解它。
“十六进制”格式将二进制数据编码为每字节 2 个十六进制数字,最有效的半字节在前。整个字符串前面是序列(以区别于转义格式)。在某些情况下,可能需要通过将初始反斜杠加倍来转义(参见第 4.1.2.1 节)。对于输入,十六进制数字可以是大写或小写,并且数字对之间允许有空格(但不能在数字对内或起始序列中)。十六进制格式与广泛的外部应用程序和协议兼容,并且它的转换速度往往比转义格式快,因此最好使用它。\x
SET bytea_output = 'hex';
SELECT '\xDEADBEEF'::bytea;
bytea
------------
\xdeadbeef
“转义”格式是该类型的传统 PostgreSQL 格式。它采用的方法将二进制字符串表示为 ASCII 字符序列,同时将那些无法表示为 ASCII 字符的字节转换为特殊的转义序列。如果从应用程序的角度来看,将字节表示为字符是有意义的,那么这种表示会很方便。但在实践中,它通常是令人困惑的,因为它模糊了二进制字符串和字符串之间的区别,而且所选择的特定转义机制有些笨拙。因此,对于大多数新应用程序,可能应避免使用这种格式。bytea
以转义格式输入值时,必须对某些值的八位字节进行转义,而所有八位字节值都可以转义。通常,要转义八位字节,请将其转换为其三位数八进制值,并在其前面加上反斜杠。反斜杠本身(八进制十进制值 92)也可以用双反斜杠表示。下显示了必须转义的字符,并在适用的情况下给出了替代转义序列。
十进制八位字节值 | 描述 转义输入表示 | 例 | 十六进制表示 |
---|---|---|---|
0 | 零八位字节 | ‘\000’ | ‘\000’::bytea |
39 | 单引号 | ‘’‘‘或’\047’ | ‘’‘’::bytea |
92 | 反斜杠 | ‘\‘或’\134’ | ‘\’::bytea |
0 到 31 和 127 到 255 | “不可打印”八位字节 | ‘\xxx’(八进制值) | ‘\001’::bytea \x01 |
对不可打印八位字节进行转义的要求因区域设置而异。在某些情况下,您可以让它们跳过
单引号必须加倍的原因是,对于 SQL 命令中的任何字符串文字都是如此。通用字符串文字分析器使用最外层的单引号,并将任何一对单引号减少为一个数据字符。输入函数看到的只是一个单引号,它将其视为纯数据字符。但是,输入函数将反斜杠视为特殊行为,显示的其他行为由该函数实现。
Bytea默认情况下,八位字节以格式输出。如果将 bytea_output更改为hexescape ,则“不可打印”八位字节将转换为其等效的三位数八进制值,并在其前面加上一个反斜杠。大多数“可打印”八位字节由其在客户端字符集中的标准表示形式输出,
SET bytea_output = 'escape';
SELECT 'abc \153\154\155 \052\251\124'::bytea;
bytea
----------------
abc klm *\251T
十进制值为 92(反斜杠)的八位字节在输出中。
十进制八位字节值 | 描述 转义输入表示 | 例 | 十六进制表示 |
---|---|---|---|
92 | 反斜杠 | |‘\134’::bytea | \ |
0 到 31 和 127 到 255 | “不可打印”八位字节 | \xxx(八进制值 | ‘\001’::bytea |
32 到 126 | “可打印”八位字节 | 客户端字符集表示 | ‘\176’::bytea |