CHAR

最近更新时间:2026-05-06 16:28:12

我的收藏
注意:
TCHouse-X 内表和 Iceberg 外表并不强制区分 CHARSTRING,两者处理逻辑相同。若需利用 CHAR 的特定标准特性,请确保在 Hive 外表场景下使用,本章内容亦仅针对此类外表场景。
固定长度字符类型,如果值长度不足,则在尾部用空格填充到指定长度;如果值长度超过指定长度,则截断多余的尾部字符。

语法

CREATE TABLE 语句的列定义中:
column_name CHAR(length)
最大长度:可指定的 length 上限为 255。

尾部空格语义

当存储的 CHAR 值短于指定长度时,查询返回该值时会在必要时以尾部空格填充,最终返回的字符串长度与定义长度相同。
在数据文件中,CHAR 值的前导空格会被保留;
如果值本身包含尾部空格,这些空格不会存储在数据文件中,但查询时会补足到定义长度。
比较两个仅尾部空格数量不同的 CHAR 值时,会被视为相等。
比较或处理 CHAR 值时,如果转换后超过定义长度,会截断;如果不足,则填充
SELECT CAST('x' AS CHAR(4)) = CAST('x ' AS CHAR(4)); -- 返回 TRUE。
CHAR_LENGTH() 返回包括尾部空格在内的长度。
LENGTH() 返回不包括尾部空格的长度。
CONCAT() 返回包括尾部空格在内的字符串。

分区

CHAR 类型可用于分区键列。但由于数值类型处理效率更高,如果分区键表示数字,建议使用合适范围的整数类型(如 INTBIGINT)。

内部细节

在内存中,CHAR 值表示为与定义长度相同大小的字节数组,值不足时右侧补空格。

列统计信息

CHAR 类型长度固定,其列统计信息中的最大和平均大小字段在运行 COMPUTE STATS 之前即已填充。

限制

CHARVARCHAR 列中的所有数据必须采用与 UTF-8 兼容的编码。如需存储二进制 BLOB,请使用 STRING 列。
表达式比较 CHARSTRINGVARCHAR 时,CHAR 会先隐式转换为 STRING,并保留尾部空格。该行为与其他数据库系统不同。如需得到 TRUE,需将两侧都 CAST 为相同长度的 CHAR
-- 如下 case 返回 1,即 true
SELECT CAST("foo " AS CHAR(5)) = CAST('foo' AS CHAR(3));