注意:
TCHouse-X 内表和 Iceberg 外表并不强制区分
VARCHAR 与 STRING,两者处理逻辑相同。若需利用 VARCHAR 的特定标准特性,请确保在 Hive 外表场景下使用,本章内容亦仅针对此类外表场景。VARCHAR 是一种变长字符类型。如果存储的值超过指定长度,在处理时会根据需要进行截断。语法
在
CREATE TABLE 语句的列定义中:column_name VARCHAR(max_length)
最大长度:可指定的 max_length 上限为 65,535。
内存占用:在内存中表示为字节数组,仅占用表示实际值所需的最小空间(不含填充)。
模式演变
你可以使用
ALTER TABLE ... CHANGE 语句在以下类型间自由转换:STRING ↔ VARCHAR(n)CHAR(n) ↔ VARCHAR(n)转换时可以更改长度值。即使原表中存在超长值,TCHouse-X 也不会报错,而是选择在查询时截断。
开发建议与限制
分区
VARCHAR 可用作分区键列。如果分区键是数字的字符串表示,出于性能和扩展性考虑,建议优先使用范围足够的整数类型(如 INT, BIGINT),因为数值计算比字符匹配更高效。编码限制
CHAR 和 VARCHAR 列中的所有数据必须使用与 UTF-8 兼容的字符编码。如果你需要存储来自其他数据库系统的二进制数据(即 BLOB 类型),请改用 STRING 列。示例
截断行为演示
CREATE TABLE varchar_1 (s VARCHAR(1));CREATE TABLE varchar_4 (s VARCHAR(4));CREATE TABLE varchar_20 (s VARCHAR(20));-- 插入数据(超长部分会被截断)INSERT INTO varchar_1 VALUES (CAST('hello' AS VARCHAR(1))); -- 存储为 'h'INSERT INTO varchar_4 VALUES (CAST('hello' AS VARCHAR(4))); -- 存储为 'hell'-- 查询对比SELECT * FROM varchar_1; -- 输出 'h'SELECT CONCAT('[', s, ']') FROM varchar_20; -- 输出 '[hello]',两边无多余空格
兼容性与转换
VARCHAR 与 STRING 在比较运算符和内置函数中可以互换使用:-- 在内置函数中使用SELECT LENGTH(CAST('foo' AS VARCHAR(100))); -- 返回 3-- 不同长度定义的 VARCHAR 进行比较SELECT CAST('xyz' AS VARCHAR(5)) > CAST('abc' AS VARCHAR(10)); -- 返回 1