STRING

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

我的收藏
STRING 是一种用于 CREATE TABLEALTER TABLE 语句的数据类型,用于存储可变长度的字符序列。

语法

CREATE TABLEALTER TABLE 语句的列定义中:
column_name STRING

长度限制与性能建议

虽然 TCHouse-X 支持 VARCHAR(max_length)CHAR(length) 以实现精确的长度控制,但出于性能最佳化考虑,建议在实际应用中尽可能使用 STRING
关于 STRING 长度的注意事项:
硬限制:单个 STRING 值及单行总大小的上限为 2 GB。超过此限制的查询将报错。
性能阈值:
处理 32 KB 或更小的字符串时,系统运行最稳定,且不会出现明显的性能或内存问题。
当字符串超过 32 KB 时,性能和内存消耗可能会下降。

字符集支持

为了确保在 TCHouse-X 所有子系统中获得最稳定、完整的支持,强烈建议将字符串值限制在 ASCII 字符集范围内
注意:
虽然 TCHouse-X 支持存储和查询 UTF-8 数据,但在处理非 ASCII 字符(如中文、特殊符号)时,以下功能可能无法按预期工作:
风险场景
具体表现
长度处理
CHARVARCHAR 的自动截断(Truncating)和填充(Padding)可能出现逻辑错误(因字节数与字符数不一致)。
排序与比较
ORDER BY 子句及比较运算符(如 >, <)可能无法按语言习惯正确排序。
分区管理
将非 ASCII 字符串作为分区键(Partition Key)可能导致数据检索异常。
若您的业务涉及多国语言特性(如特定的排序规则、扩展 ASCII 变体 ISO-8859-1 等),将排序、格式化或显示逻辑移至应用程序端实现,而非依赖数据库引擎。

数据转换

隐式转换

TCHouse-X 不会自动将 STRING 转换为任何数值类型。如果格式匹配,TCHouse-X 会自动将 STRING 转换为 TIMESTAMP

显式转换

可使用 CAST()STRING 转换为 TINYINT, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, DECIMALTIMESTAMP
不能直接将 STRING 转换为 BOOLEAN
BOOLEANSTRING 时,true 返回 'true',false 返回 'false'。

特殊注意事项

分区

虽然使用 STRING 列作为分区键很方便(即使内容是数字),但出于性能和可扩展性考虑,强烈建议使用数值列(如 INT, SMALLINT)作为分区键(例如 YEAR, MONTH, DAY)。数值类型的内存占用更少,计算速度更快。

空字符串与 NULL

DISTINCTGROUP BY 等子句中,TChouse-X 将 零长度字符串 ("")、NULL 和 空格 视为三个不同的值。

示例

字面量与符号转义

SELECT 'I am a single-quoted string';
SELECT "I am a double-quoted string";
SELECT 'I\\'m a single-quoted string with an apostrophe'; -- 使用单引号,并对内部单引号进行转义
SELECT "I\\'m a double-quoted string with an apostrophe"; -- 使用双引号,并对内部单引号进行转义
SELECT 'I am a "short" single-quoted string containing quotes'; -- 使用双引号,内部单引号不需要转义
SELECT "I am a \\"short\\" double-quoted string containing quotes";-- 使用双引号,并对内部双引号进行转义

字符串函数

-- 拼接与转换
SELECT CONCAT("Counting: ", CAST(3 AS STRING), ' little pigs.');
-- 截取子串
SELECT SUBSTR("hello world", 7, 5); -- 返回 'world'

表操作

CREATE TABLE t1 (s1 STRING, s2 STRING);
INSERT INTO t1 VALUES ("hello", 'world'), ('7', "wonders");
-- 使用 LIKE 过滤
SELECT s1, s2, length(s1) FROM t1 WHERE s2 LIKE 'w%';