注意:TCHouse-X 内表和 Iceberg 外表并不强制区分 VARCHAR 与 STRING,两者处理逻辑相同。若需利用 VARCHAR 的特定标准特性,请确保在 Hive 外表场景下使用,本章内容亦仅针对此类外表场景。
一、语法
在 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