购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 字符串类型

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实例:

输出: u+w1qDFIOOFjNnpgilP5tCHbDXPQ8KX1LcKR24ExwUssFCa9IaDZCvGQbTZOjDYc

点击中间区域
呼出菜单
上一章
目录
下一章
×