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数据

posted @   让我们来分析分析  阅读(359)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示