二进制数据类型(BINARY 和 VARBINARY)

存储原始字节数据,如 IP 地址,最多 65000 个字节。BINARYBINARY VARYING (VARBINARY) 数据类型统称为二进制字符串类型,其值称为二进制字符串。二进制字符串是八位字节或字节序列。

BYTEARAWVARBINARY 的同义词。

语法

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 文档中也曾强调过。

二进制值也可以通过在值前加上反斜杠 '\\' 以八进制格式表示。

也可以输入用可打印字符表示的值。例如,十六进制值 '0x61' 也可以用符号 a 来表示。

请参阅数据加载

输入时,字符串将从

这两个函数都使用 VARCHAR 实参并返回 VARBINARY 值。

输出格式

和输入格式一样,输出格式是八进制代码和可打印的 ASCII 字符的组合。在可打印的 ASCII 字符范围(范围 [0x20, 0x7e])内的字节由相应的 ASCII 字符表示,反斜杠 ('\\') 除外,反斜杠可以转义为 '\\\'。所有其他字节值由相应的八进制值表示。例如,字节 {97,92,98,99},在 ASCII 中为 {a,\\,b,c},转换成文本后为 'a\\\bc'

二元运算符和函数

二元运算符 &~|# 针对二进制数据类型采取特殊的行为,如位运算符中所述。

二进制数据类型支持以下聚合函数:

BIT_ANDBIT_ORBIT_XOR 是应用于组中每个非空值的位元运算,而 MAXMIN 是二进制值的逐字节比较。

和对应的二元运算符一样,如果组中的值长度不同,聚合函数会通过用零字节将较短的值扩展到列的全宽,按照长度相等的值来处理这些值。例如,假定一个组包含值 'ff', null, and 'f',二元聚合会忽略 null 值,并值 'f' 视为 'f0'。此外,和对应的二元运算符一样,这些聚合函数会显式处理 VARBINARY 类型并通过转换隐式处理 BINARY 类型。请参阅数据类型强制运算符 (CAST)

二进制与字符数据类型

BINARYVARBINARY 二进制类型分别类似于 CHARVARCHAR 字符数据类型。它们的区别如下:

  • 二进制数据类型包含字节串(八位字节或字节序列)。

  • 字符数据类型包含字符串(文本)。

  • 二进制数据类型的长度以字节为单位,而字符数据类型的长度以字符为单位。

示例

以下示例显示 HEX_TO_BINARYTO_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_ANDBIT_ORBIT_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)