注意:
TCHouse-X 内表和 Iceberg 外表并不强制区分
CHAR 与 STRING,两者处理逻辑相同。若需利用 CHAR 的特定标准特性,请确保在 Hive 外表场景下使用,本章内容亦仅针对此类外表场景。固定长度字符类型,如果值长度不足,则在尾部用空格填充到指定长度;如果值长度超过指定长度,则截断多余的尾部字符。
语法
在
CREATE TABLE 语句的列定义中:column_nameCHAR(length)
最大长度:可指定的 length 上限为 255。
尾部空格语义
当存储的
CHAR 值短于指定长度时,查询返回该值时会在必要时以尾部空格填充,最终返回的字符串长度与定义长度相同。在数据文件中,
CHAR 值的前导空格会被保留;如果值本身包含尾部空格,这些空格不会存储在数据文件中,但查询时会补足到定义长度。
比较两个仅尾部空格数量不同的
CHAR 值时,会被视为相等。比较或处理 CHAR 值时,如果转换后超过定义长度,会截断;如果不足,则填充
SELECT CAST('x' AS CHAR(4)) = CAST('x ' AS CHAR(4)); -- 返回 TRUE。CHAR_LENGTH() 返回包括尾部空格在内的长度。LENGTH() 返回不包括尾部空格的长度。CONCAT() 返回包括尾部空格在内的字符串。分区
CHAR 类型可用于分区键列。但由于数值类型处理效率更高,如果分区键表示数字,建议使用合适范围的整数类型(如 INT、BIGINT)。内部细节
在内存中,
CHAR 值表示为与定义长度相同大小的字节数组,值不足时右侧补空格。列统计信息
CHAR 类型长度固定,其列统计信息中的最大和平均大小字段在运行 COMPUTE STATS 之前即已填充。限制
CHAR 和 VARCHAR 列中的所有数据必须采用与 UTF-8 兼容的编码。如需存储二进制 BLOB,请使用 STRING 列。表达式比较
CHAR 与 STRING 或 VARCHAR 时,CHAR 会先隐式转换为 STRING,并保留尾部空格。该行为与其他数据库系统不同。如需得到 TRUE,需将两侧都 CAST 为相同长度的 CHAR:-- 如下 case 返回 1,即 trueSELECT CAST("foo " AS CHAR(5)) = CAST('foo' AS CHAR(3));