ClickHouse的字符串类型主要包括:
❑不定长字符串String,也就是动态长度变化字符串。
❑固定长度字符串FixedString( N )。这里的 N 是最大字节数,不是长度,例如UTF-8字符占用3个字节,GBK字符占用2个字节。
❑特殊字符串UUID。背后存储的是数值。
ClickHouse没有针对字符串中的字符做编码操作。字符串可以包含一组任意字节,这些字节按原样存储和输出。编码和解码操作留给客户端。如果存储文本类型内容,推荐使用UTF-8编码,且读取和写入数据都约定统一使用UTF-8编码。
1.String
String类型不限制字符串的长度,可以直接替代其他数据库的VARCHAR、BLOB、CLOB等字符串类型。相比VARCHAR这类要预测数据最大长度的类型,显然String要方便很多。
执行如下SQL语句:
输出:
下面的SQL展示了在ClickHouse中计算字符串长度和截取字串的方法。
输出:
需要注意的是,ClickHouse中的String字符串是用单引号的,用双引号会报错。
这里来看一个例子,在终端执行如下SQL语句:
输出:
通过报错日志《Missing columns:'123'》可以看出,针对双引号里面的内容,ClickHouse是当成列名来处理的。可以通过源码DataTypeString.cpp了解ClickHouse中的String类型与其他数据库的等价类型。
2.FixedString
FixedString类型存储定长字符串。用法如下:
其中, N 代表 N 个字节。
当写入FixedString类型数据的时候,如果数据字节数大于 N ,则会返回一个“Too large value for FixedString( N )”的异常。如果数据字节数小于 N ,则会使用NULL来填充末尾字符。
在查询条件WHERE中,如果需要匹配FixedString类型的列,传入的查询参数要自行补尾部的\0,否则有可能导致查询条件失效,因为要求写入数据和查询条件都是固定字节数。
下面看一个实例。执行如下SQL语句:
不会返回任何结果。此时需要使用空字节来填充筛选条件,修改成如下这样即可:
使用FixedString类型的典型场景列举如下:
❑存储IP地址,如使用FixedString(16)存储IPV6地址二进制值。
❑存储哈希值,如使用FixedString(16)存储MD5的二进制值,使用FixedString(32)存储SHA256的二进制值。
使用toFixedString()函数来生成FixedString,执行如下SQL语句:
输出:
3.UUID
UUID(Universally Unique IDentifier,通用唯一标识符)是一个16字节的数字,用于标识记录,也称为GUID(全球唯一标识符)。
UUID的核心特性总结如下:
❑全局时空唯一性。
❑固定长度为128位,也就是16字节。
❑分配速率极高,单机每秒可以生成超过1000万个UUID(实际上更高)。
UUID最初用于Apollo网络计算系统和开放软件Foundation(OSF)的分布式计算环境(DCE)。UUID规范可参考https://www.ietf.org/rfc/rfc4122.txt。
(1)生成UUID
ClickHouse提供了内置函数generateUUIDv4()来生成UUID。
SQL实例:
输出:
从上面的结果可以看到,UUID共有32位(中间的分隔符不算),它的格式为8-4-4-4-12。UUID的默认值为:00000000-0000-0000-0000-000000000000。
我们可以用toTypeName()函数看一下UUID的数据类型。
SQL实例:
输出:
(2)字符串转UUID
可以通过toUUID()函数把符合格式的String字符串(如果格式不对,会报“Cannot parse UUID from String”错误)转成UUID。
SQL实例:
输出: