字符串可以任意长度的。它可以包含任意的字节集,包含空字节。因此,字符串类型可以代替其他 DBMSs 中的 VARCHAR、BLOB、CLOB 等类型。
ClickHouse 没有编码的概念。字符串可以是任意的字节集,按它们原本的方式进行存储和输出。
若需存储文本,我们建议使用 UTF-8 编码。至少,如果你的终端使用UTF-8(推荐),这样读写就不需要进行任何的转换了。
同样,对不同的编码文本 ClickHouse 会有不同处理字符串的函数。
比如,length
函数可以计算字符串包含的字节数组的长度,然而 lengthUTF8
函数是假设字符串以 UTF-8 编码,计算的是字符串包含的 Unicode 字符的长度。
固定长度 N 的字符串(N 必须是严格的正自然数)。
您可以使用下面的语法对列声明为FixedString
类型:
<column_name> FixedString(N)
其中N
表示自然数。
当数据的长度恰好为N个字节时,FixedString
类型是高效的。 在其他情况下,这可能会降低效率。
可以有效存储在FixedString
类型的列中的值的示例:
FixedString(16)
)FixedString(16)
,SHA256使用FixedString(32)
)请使用UUID数据类型来存储UUID值,。
当向ClickHouse中插入数据时,
N
,将抛出Too large value for FixedString(N)
异常。当做数据查询时,ClickHouse不会删除字符串末尾的空字节。 如果使用WHERE
子句,则须要手动添加空字节以匹配FixedString
的值。 以下示例阐明了如何将WHERE
子句与FixedString
一起使用。
考虑带有FixedString(2)
列的表:
┌─name──┐ │ b │ └───────┘
查询语句SELECT * FROM FixedStringTable WHERE a = 'b'
不会返回任何结果。请使用空字节来填充筛选条件。
SELECT * FROM FixedStringTableWHERE a = 'b\0'
┌─a─┐ │ b │ └───┘
这种方式与MySQL的CHAR
类型的方式不同(MySQL中使用空格填充字符串,并在输出时删除空格)。
请注意,FixedString(N)
的长度是个常量。仅由空字符组成的字符串,函数length返回值为N
,而函数empty的返回值为1
。