VARCHAR

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

我的收藏
注意:
TCHouse-X 内表和 Iceberg 外表并不强制区分 VARCHARSTRING,两者处理逻辑相同。若需利用 VARCHAR 的特定标准特性,请确保在 Hive 外表场景下使用,本章内容亦仅针对此类外表场景。
VARCHAR 是一种变长字符类型。如果存储的值超过指定长度,在处理时会根据需要进行截断。

语法

CREATE TABLE 语句的列定义中:
column_name VARCHAR(max_length)
最大长度:可指定的 max_length 上限为 65,535。
内存占用:在内存中表示为字节数组,仅占用表示实际值所需的最小空间(不含填充)。

模式演变

你可以使用 ALTER TABLE ... CHANGE 语句在以下类型间自由转换:
STRINGVARCHAR(n)
CHAR(n)VARCHAR(n)
转换时可以更改长度值。即使原表中存在超长值,TCHouse-X 也不会报错,而是选择在查询时截断。

开发建议与限制

分区

VARCHAR 可用作分区键列。如果分区键是数字的字符串表示,出于性能和扩展性考虑,建议优先使用范围足够的整数类型(如 INT, BIGINT),因为数值计算比字符匹配更高效。

编码限制

CHARVARCHAR 列中的所有数据必须使用与 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]',两边无多余空格

兼容性与转换

VARCHARSTRING 在比较运算符和内置函数中可以互换使用:
-- 在内置函数中使用
SELECT LENGTH(CAST('foo' AS VARCHAR(100))); -- 返回 3

-- 不同长度定义的 VARCHAR 进行比较
SELECT CAST('xyz' AS VARCHAR(5)) > CAST('abc' AS VARCHAR(10)); -- 返回 1