注意:TCHouse-X 内表和 Iceberg 外表并不强制区分 CHAR 与 STRING,两者处理逻辑相同。若需利用 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 类型可用于分区键列。但由于数值类型处理效率更高,如果分区键表示数字,建议使用合适范围的整数类型(如 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));