字符数据类型(CHAR 和 VARCHAR)
存储由字母、数字和符号组成的字符串。数据类型 CHARACTER (CHAR) 和 CHARACTER VARYING (VARCHAR) 统称为字符串类型,而字符串类型的值称为字符串。
字符数据可以存储为固定长度或可变长度的字符串。固定长度的字符串在输出时通过空格向右扩展;可变长度的字符串不能扩展。
SQL 语句中的字符串字面量必须以单引号引起。
语法
{ CHAR | CHARACTER } [ (octet‑length) ]
{ VARCHAR | CHARACTER VARYING ] } [ (octet‑length) ]
实参
CHAR 与 VARCHAR 数据类型
以下差异适用于 CHAR 和 VARCHAR 数据:
-
CHAR 在概念上是固定长度、填充空格式字符串。结尾空格将在输入时移除,并且在输出时还原。默认长度为 1,最大长度为 65000 个八位字节(字节)。
-
VARCHAR 是可变长度的字符数据类型。默认长度为 80,最大长度为 65000 个八位字节。对于长于 65000 的字符串值,使用 长数据类型。值可以包括结尾空格。
通常,您对所有字符串数据使用 VARCHAR。在需要固定宽度的字符串输出时,请使用 CHAR。例如,对于要传输到需要固定宽度字符串的旧系统的数据,可以使用 CHAR 列。
设置最大长度
在您定义字符列时,请指定要存储在某一列中的任何字符串的最大大小。例如,要存储最大长度为 24 个八位字节的字符串,请使用以下定义之一:
CHAR(24) --- fixed-length
VARCHAR(24) --- variable-length
VARCHAR 和 CHAR 数据类型的最大长度参数是指可存储在该字段中的八位字节数,而不是字符数(Unicode 代码点)。在使用多字节 UTF-8 字符时,必须根据数据将字段大小调整为每个字符能够容纳 1 至 4 个八位字节。如果加载到 VARCHAR 或 CHAR 列中的数据超过了为该列指定的最大大小,将根据 UTF-8 字符边界截断数据,以符合指定大小。请参阅 COPY
。
注意
请记得在列宽声明中包括多字节字符所需的额外八位字节,牢记 65000 八位字节列宽限制。由于 Vertica 中的压缩,导致过高估计这些字段的长度产生成本,主要是在加载时和排序期间产生成本。
NULL 与 NUL
NULL 和 NUL 区别如下:
-
NUL 表示其 ASCII/Unicode 代码为 0 的字符,有时限定为“ASCII NUL”。
-
NULL 是指没有值,字段(列)或常数皆是如此,字符却不。
CHAR、LONG VARCHAR 和 VARCHAR 字符串数据类型接受 ASCII NUL 值。
在升序排序中,NULL 出现在最后(最大)。
有关 NULL 排序的更多信息,请参阅 NULL 排序顺序。
以下示例将包含 NUL 值的输入字符串转换为 VARCHAR:
=> SELECT 'vert\0ica'::CHARACTER VARYING AS VARCHAR;
VARCHAR
---------
vert\0ica
(1 row)
结果包含 9 个字符:
=> SELECT LENGTH('vert\0ica'::CHARACTER VARYING);
length
--------
9
(1 row)
如果您使用扩展字符串字面量,则长度为 8 个字符:
=> SELECT E'vert\0ica'::CHARACTER VARYING AS VARCHAR;
VARCHAR
---------
vertica
(1 row)
=> SELECT LENGTH(E'vert\0ica'::CHARACTER VARYING);
LENGTH
--------
8
(1 row)