二进制数据类型(BINARY 和 VARBINARY)
存储原始字节数据,如 IP 地址,最多 65000 个字节。BINARY 和 BINARY VARYING (VARBINARY) 数据类型统称为二进制字符串类型,其值称为二进制字符串。二进制字符串是八位字节或字节序列。
BYTEA 和 RAW 是 VARBINARY 的同义词。
语法
BINARY ( length )
{ VARBINARY | BINARY VARYING | BYTEA | RAW } ( max-length )
实参
BINARY 和 VARBINARY 数据类型
BINARY 和 VARBINARY 数据类型具有以下属性:
-
BINARY:一个固定宽度的 length 字节字符串,其中字节数声明为类型的可选说明符。如果忽略 length,默认值为 1。必要时,值将向右扩展到包含零字节的列的全宽。例如:
=> SELECT TO_HEX('ab'::BINARY(4)); to_hex ---------- 61620000
-
VARBINARY:一个宽度可变的字符串,可扩展到 max-length 字节长度,其中最大字节数声明为类型的可选说明符。默认值是默认的属性大小,即 80,最大长度为 65000 个字节。VARBINARY 值不会扩展到列的全宽。例如:
=> SELECT TO_HEX('ab'::VARBINARY(4)); to_hex -------- 6162
输入格式
使用二进制值时,可以使用多种格式。十六进制格式通常最简单,Vertica 文档中也曾强调过。
二进制值也可以通过在值前加上反斜杠 '\\'
以八进制格式表示。
注意
如果使用vsql
,在输入内容中插入另一个反斜杠时必须使用转义字符 (\\
);例如,输入 '\141'
作为 '\\\141'
。
也可以输入用可打印字符表示的值。例如,十六进制值 '0x61'
也可以用符号 a
来表示。
请参阅数据加载。
输入时,字符串将从
-
十六进制表示转换为二进制值(使用 HEX_TO_BINARY 函数)。
-
位字符串 表示转换为二进制值(使用 BITSTRING_TO_BINARY 函数)。
这两个函数都使用 VARCHAR 实参并返回 VARBINARY 值。
输出格式
和输入格式一样,输出格式是八进制代码和可打印的 ASCII 字符的组合。在可打印的 ASCII 字符范围(范围 [0x20, 0x7e]
)内的字节由相应的 ASCII 字符表示,反斜杠 ('\\'
) 除外,反斜杠可以转义为 '\\\'
。所有其他字节值由相应的八进制值表示。例如,字节 {97,92,98,99},在 ASCII 中为 {a,\\,b,c}
,转换成文本后为 'a\\\bc'
。
二元运算符和函数
二元运算符 &
、~
、|
和 #
针对二进制数据类型采取特殊的行为,如位运算符中所述。
二进制数据类型支持以下聚合函数:
BIT_AND、BIT_OR 和 BIT_XOR 是应用于组中每个非空值的位元运算,而 MAX 和 MIN 是二进制值的逐字节比较。
和对应的二元运算符一样,如果组中的值长度不同,聚合函数会通过用零字节将较短的值扩展到列的全宽,按照长度相等的值来处理这些值。例如,假定一个组包含值 'ff', null, and 'f'
,二元聚合会忽略 null 值,并值 'f'
视为 'f0'
。此外,和对应的二元运算符一样,这些聚合函数会显式处理 VARBINARY 类型并通过转换隐式处理 BINARY 类型。请参阅数据类型强制运算符 (CAST)。
二进制与字符数据类型
BINARY 和 VARBINARY 二进制类型分别类似于 CHAR 和 VARCHAR 字符数据类型。它们的区别如下:
-
二进制数据类型包含字节串(八位字节或字节序列)。
-
字符数据类型包含字符串(文本)。
-
二进制数据类型的长度以字节为单位,而字符数据类型的长度以字符为单位。
示例
以下示例显示 HEX_TO_BINARY 和 TO_HEX 的用法。
表 t
及其投影用二进制列创建:
=> CREATE TABLE t (c BINARY(1));
=> CREATE PROJECTION t_p (c) AS SELECT c FROM t;
插入最小字节值和最大字节值:
=> INSERT INTO t values(HEX_TO_BINARY('0x00'));
=> INSERT INTO t values(HEX_TO_BINARY('0xFF'));
然后可以在输出时使用 TO_HEX 函数用十六进制设置二进制值的格式:
=> SELECT TO_HEX(c) FROM t;
to_hex
--------
00
ff
(2 rows)
BIT_AND、BIT_OR 和 BIT_XOR 函数在处理一组值时很有用。例如,创建一个包含二进制列的示例表和投影:
示例使用 t
表,该表在单个列中包含了 VARBINARY
数据类型:
=> CREATE TABLE t ( c VARBINARY(2) );
=> INSERT INTO t values(HEX_TO_BINARY('0xFF00'));
=> INSERT INTO t values(HEX_TO_BINARY('0xFFFF'));
=> INSERT INTO t values(HEX_TO_BINARY('0xF00F'));
查询表 t
以查看列 c
输出:
=> SELECT TO_HEX(c) FROM t;
TO_HEX
--------
ff00
ffff
f00f
(3 rows)
现在发出位元 AND 运算。因为这些都是聚合函数,因此使用 (ff00&(ffff)&f00f)
对结果执行隐式 GROUP BY 操作:
=> SELECT TO_HEX(BIT_AND(c)) FROM t;
TO_HEX
--------
f000
(1 row)
对 (ff00|(ffff)|f00f)
发出位元 OR 运算:
=> SELECT TO_HEX(BIT_OR(c)) FROM t;
TO_HEX
--------
ffff
(1 row)
对 (ff00#(ffff)#f00f)
发出位元 XOR 运算:
=> SELECT TO_HEX(BIT_XOR(c)) FROM t;
TO_HEX
--------
f0f0
(1 row)