Note2.ClickHouse数据类型
CK的数据类型主要分为三类,分别为:基础类型、复合类型和特殊类型。
1、基础类型
基础类型只包含数值、字符串和时间三种类型,没有Boole类型。
1.1、数值类型
a.整型
CK中使用Int8、Int16、Int32和Int64来表示整数类型,分别于与其他数据库中的Tinyint、Smallint、Int和Bigint对应,其中末尾的数字表示该类型数值占用空间字节的大小。
无符号整形使用UInt8、UInt16、UInt32和UInt64来进行表示。
b.浮点型
CK中使用Float32和Float64来分别表示单精度浮点数和双精度浮点数,与其他数据库中的Float和Double对应。除此之外,理论上CK还支持一些特殊的浮点类型表示,例如正负无穷inf,-inf,但本人验证新版CK并不支持这种类型表示.
SELECT 0.5/0,-0.5/0,0/0;
输出结果:
# divide(0.5, 0) divide(-0.5, 0) divide(0, 0) 0 null null null
c.定点数(Decimal)
CK中一般使用Decimal32、Decimal64、Decimal128来表示定点数,此种方法表示的数值精度要比浮点数要高,但当前主流设备的CPU一般为64位,在进行Decimal128运算时数据要慢很多。
1.2、字符串类型
字符串类型主要包含String、FixedString和UUID三种。
a.String
该类型与其他数据库中的String相似,在声明时不需要指定空间大小。
b.FixedString
FixedString与其他数据库中的varchar、char类似,需要进行字符空间的说明·,但和char这类不同的是,如果实际字符串长度小于空间长度,会使用null字节进行填充,例如。
SELECT 'hello', length('hello') as length, toFixedString('hello',10) as fixedhello, length(toFixedString('hello',10)) as length1;
输出结果
# 'hello' length fixedhello length1 0 hello 5 hello 10
c.UUID
UUID是一种数据库常用的主键类型,但在CK中他的地位和其他的类型等价,该类型共32位,格式为8-4-4-4-12,如果该类型数据在写入时未被赋值,贼会被自动填充为0
1.3、时间类型
CK中的时间类型主要分为DateTime、DateTime64和Date三类,均支持以字符串的格式存入数据库中,但CK中暂不支持时间戳类型。
DateTime精确到秒、DateTime64精确到亚秒、Date精确到天,例如:
SELECT toDateTime(now()) as time_sec, toDateTime64(now(),2) as time_min,--第二个参数表示精确到秒后几位 toDate(now()) as time_day;
输出结果
# time_sec time_min time_day 0 2022-01-05 11:52:05 2022-01-05 11:52:05.00 2022-01-05
2、复合类型
CK中的复合类型主要包括数组(Array)、元组(Tuple)、枚举(Enum)和嵌套(Nested)四种,这是一般其他数据库不具有的特性。
2.1、数组
CK中的数组类型定义可以使用array(a,b),[a,b]进行声明,数组内数据类型必须兼容(如数值型和字符型在同一数组内即为不兼容),否则会报错。从数组中取数时,要取第一个数则在索引处填1,超出数组容量范围会返回零,例如:
SELECT array(1,3,5) as a1, [1,3,5] as a2, [1,3,5,null] as a3, a2[2] as a4, a2[5] as a5;
输出结果:
# a1 a2 a3 a4 a5 0 [1,3,5] [1,3,5] [1,3,5,null] 3 0
2.2、元组
元组可以使用tuple(a,b),(a,b)进行声明,但不要求元组内的数据类型一定是兼容的,例如:
SELECT tuple(1,3,5) as a1, (1,3,'5') as a2, (1,3,5,null) as a3;
输出结果:
# a1 a2 a3 0 [1,3,5] [1,3,"5"] [1,3,5,null]
2.3、枚举
枚举类型分为Enum8、Enum16两种,主要的区别为取值范围不同,采用(String:Int)Key/Value键值对的形式定义数据,所以Enum8和Enum16分别会对应(String:Int8)和(String:Int16)。特别的,枚举类型中的Key和Value值都不能为Null,但Key允许是空字符串。
2.4、嵌套
本质上属于是多维数据的结构,行与行之间的数组长度无需对齐,但同一行内每个数组的元素个数必需相等。
3、特殊类型
Nullable修饰字段,使其可以存储空值;Domain域名类型,可以存储ipv4、ipv6数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构