STRING 是一种用于 CREATE TABLE 和 ALTER TABLE 语句的数据类型,用于存储可变长度的字符序列。语法
在
CREATE TABLE 或 ALTER 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 字符(如中文、特殊符号)时,以下功能可能无法按预期工作:
风险场景 | 具体表现 |
长度处理 | CHAR 或 VARCHAR 的自动截断(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, DECIMAL或 TIMESTAMP。不能直接将
STRING 转换为 BOOLEAN。BOOLEAN 转 STRING 时,true 返回 'true',false 返回 'false'。特殊注意事项
分区
虽然使用
STRING 列作为分区键很方便(即使内容是数字),但出于性能和可扩展性考虑,强烈建议使用数值列(如 INT, SMALLINT)作为分区键(例如 YEAR, MONTH, DAY)。数值类型的内存占用更少,计算速度更快。空字符串与 NULL
在
DISTINCT 和 GROUP 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%';