ClickHou深入浅出之(二)实战篇(数据类型)

更新时间:2023-07-26 19:49:57 阅读: 评论:0

ClickHou深⼊浅出之(⼆)实战篇(数据类型)
⼀、数据类型
基础类型只有数值、字符串和时间三种类型,没有 Boolean 类型,但可以使⽤整型的 0 或 1 替代。 ClickHou 的数据类型和常见的其他存储系统的数据类型对⽐:
1.1、数值类型
数值类型分为整数、浮点数和定点数三类
1.1.1、整数
在普遍观念中,常⽤Tinyint、Smallint、Int 和 Bigint 指代整数的不同取值范围。⽽ ClickHou 则直接 使⽤Int8、Int16、Int32 和Int64 指代 4 种⼤⼩的 Int 类型,其末尾的数字正好表明了占⽤字节的⼤⼩ (8位=1字节)。ClickHou ⽀持⽆符号的整数,使⽤前缀 U 表⽰。固定长度的整型,包括有符号整 型或⽆符号整型。
整型范围:( 到 ):
Int8 - [-128 : 127]
Int16 - [-32768 : 32767]
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]
⽆符号整型范围( 0到 ):
UInt8 - [0 : 255]
UInt16 - [0 : 65535]
UInt32 - [0 : 4294967295]
UInt64 - [0 : 18446744073709551615]
1.1.2、浮点型
与整数类似,ClickHou 直接使⽤ Float32 和 Float64 代表单精度浮点数以及双精度浮点数
ClickHou 的浮点类型有两种值:
Float32 - float
Float64 - double
建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,如时间⽤毫秒为单位表⽰,因为浮点型进⾏计算时可能引起四舍五⼊的误差。
bigdata02 :) lect 1 - 0.9;
目空一切的意思SELECT 1 - 0.9
┌───────minus(1, 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘
1 rows in t. Elapd: 0.00
2 c.
与标准 SQL 相⽐,ClickHou ⽀持以下类别的浮点数:
Inf - 正⽆穷:
bigdata02 :) lect 1 / 0;
SELECT 1 / 0
┌─divide(1, 0)─┐
│          inf │
└──────────────┘
1 rows in t. Elapd: 0.001 c.
-Inf - 负⽆穷:
bigdata02 :) lect -1 / 0;
SELECT -1 / 0
┌─divide(-1, 0)─┐
│          -inf │
└───────────────┘
1 rows in t. Elapd: 0.001 c.
NaN - ⾮数字:
bigdata02 :) lect 0 / 0;
SELECT 0 / 0
┌─divide(0, 0)─┐
│          nan │
└──────────────┘
1 rows in t. Elapd: 0.001 c.
在使⽤浮点数的时候,应当要意识到它是有限精度的。假如,分别对 Float32 和 Float64 写⼊超过有效 精度的数值,下⾯我们看看会发⽣什么。例如,将拥有 20 位⼩数的数值分别写⼊ Float32 和 Float64, 此时结果就会出现数据误差:
bigdata02 :) lect toFloat32('0.1234567901234567890123456789') as a,
toTypeName(a);
┌──────────a─┬─toTypeName(toFloat32('0.1234567901234567890123456789'))─┐
│ 0.12345679 │ Float32                                                │
└────────────┴─────────────────────────────────────────────────────────┘
bigdata02 :) lect toFloat64('0.1234567901234567890123456789') as a,
toTypeName(a);
┌───────────────────a─┬─toTypeName(toFloat64('0.1234567901234567890123456789'))─┐
│ 0.12345679012345678 │ Float64│
└─────────────────────┴─────────────────────────────────────────────────────────┘
可以发现,Float32 从⼩数点后第 8 位起及 Float64 从⼩数点后第 17 位起,都产⽣了数据溢出。
1.1.3、Decimal
如果要求更⾼精度的数值运算,则需要使⽤定点数。ClickHou 提供了Decimal32、Decimal64 和 Decimal128 三种精度的定点数。可以通过两种形式声明定点:简写⽅式有 Decimal32(S)、 Decimal64(S)、Decimal128(S)三种,原⽣⽅式为Decimal(P, S),其中:
P代表精度,决定总位数(整数部分+⼩数部分),取值范围是1~38;
S代表规模,决定⼩数位数,取值范围是0~P。
简写⽅式与原⽣⽅式的对应关系
嫁接蟹爪兰
在使⽤两个不同精度的定点数进⾏四则运算的时候,它们的⼩数点位数 S 会发⽣变化。在进⾏加法运算 时,S 取最⼤值。例如下⾯的查询,toDecimal64(2,4) 与 toDecimal32(2,2) 相加后 S=4:
lect toDecimal64(2, 4) + toDecimal32(2, 2);
结果:
┌─plus(toDecimal64(2, 4), toDecimal32(2, 2))─┐
│                                    4.0000 │
└────────────────────────────────────────────┘
注意 Decimal 进⾏加减乘除四则运算的时候的精度问题!总结⼀下是:
1.1.4、布尔型
没有单独的类型来存储布尔值。可以使⽤ UInt8 类型,取值限制为 0 或 1。⽽且在 ClickHou 使⽤过 程中,你也会发现,做⽐较得到的结果都是 1 或者 0,⽽不是通常意义上的 True 或者 Fal
lect 1 == 1;
lect 1 == 2;
太清宝诰
1.2、字符串
字符串类型可以细分为 String、FixedString 和 UUID 三类
1.2.1、String类型
字符串可以任意长度的。它可以包含任意的字节集,包含空字节,可以⽤来替换 VARCHAR ,BLOB,CLOB 等数据类型。字符串由String 定义,长度不限。因此在使⽤ String 的时候⽆须声明⼤⼩。 它完全代替了传统意义上数据库的Varchar、Text、Clob 和 Blob 等字符类型。String 类型不限定字符 集,因为它根本就没有这个概念,所以可以将任意编码的字符串存⼊其中。但是为了程序的规范性和可 维护性,在同⼀套程序中应该遵循使⽤统⼀的编码,例如“统⼀保持UTF-8编码”就是⼀种很好的约定。
create table dylan_test02(
id UInt8,
name String
) engine = Memory;用微信
1.2.2、FixedString(N)
FixedString 类型和传统意义上的 Char 类型有些类似,对于⼀些字符有明确长度的场合,可以使⽤固
定长度的字符串。定长字符串通过FixedString(N) 声明,其中 N 表⽰字符串长度。但与 Char 不同的是, FixedString 使⽤ null字节填充末尾字符,⽽ Char 通常使⽤空格填充。⽐如在下⾯的例⼦中,字符串 ‘abc’ 虽然只有 3 位,但长度却是5,因为末尾有2位空字符填充:
SELECT toFixedString('abc', 5), LENGTH(toFixedString ('abc',5))AS LENGTH;
固定长度 N 的字符串,N 必须是严格的正⾃然数。当服务端读取长度⼩于 N 的字符串时候,通过在字 符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度⼤于 N 的字符串时候,将返回错误消息。 与 String 相⽐,极少会使⽤ FixedString,因为使⽤起来不是很⽅便。
头图片总结:
A、N是最⼤字节数(Byte),不是字符长度,如果是UTF8字符串,那么就会占⽤3字节,GBK会占⽤2字节.
B、当内容少于N,数据库会⾃动在右填充空字节(null byte)(跟PGsql不⼀样,PGsql填充的是空格),当内容⼤于N时候,会抛出错误.
C、当写⼊内容后⾯后空字节,系统不会⾃动去裁剪,查询的时候也会被输出(mysql不会输出)
D、FixedString(N) ⽐ String ⽀持更少的⽅法
事不关己的意思
1.2.3、UUID
UUID 是⼀种数据库常见的主键类型,在 ClickHou 中直接把它作为⼀种数据类型。UUID 共有 32 位,它的格式为00000000-0000-0000-0000-000000000000。如果⼀个 UUID 类型的字段在写⼊数据时没有被赋值,则会依照格式使⽤ 0 填充,例如:
-- 建表
create table uuid_test(
c1 UUID,
c2 String
) engine = Memory;
-- 插⼊数据
inrt into uuid_test lect generateUUIDv4(), 't1'; inrt into uuid_test (c2) lect 't2';
-- 查询数据
lect * from uuid_test;
⾃⾏执⾏结果可以看到,第⼆⾏没有被赋值的 UUID 被 0 填充了。
1.3. ⽇期时间类型
时间类型分为 DateTime、DateTime64 和 Date 三类。ClickHou ⽬前没有时间戳类型。时间类型最 ⾼的精度是秒,也就是说,如果需要处理毫秒、微秒等⼤于秒分辨率的时间,则只能借助 UInt 类型实 现。
Date:  2020-02-02
DateTime: 2020-02-02 20:20:20
DateTime64: 2020-02-02 20:20:20.335
1.3.1. Date类型
⽇期类型,⽤两个字节存储,表⽰从 1970-01-01 (⽆符号) 到当前的⽇期值。允许存储从 Unix 纪元开始 到编译阶段定义的上限阈值常量(⽬前上限是2106年,但最终完全⽀持的年份为2105)。最⼩值输出 为1970-01-01。
Date类型不包含具体的时间信息,只精确到天,它⽀持字符串形式写⼊。 需要注意的是:⽇期中没有存储时区信息。默认情况下,客户端连接到服务的时候会使⽤服务端时区。
可以通过启⽤客户端命令⾏选项 --u_client_time_zone 来设置使⽤客户端时间。
-- 建表
drop table if exists date_test; create table date_test(
c1 Date
) engine = Memory;
-- 插⼊数据
inrt into date_test values('2021-04-25');
--查询
lect c1, toTypeName(c1) from date_test;
1.3.
2. DateTime类型
什么节吃汤圆
时间戳类型。⽤四个字节(⽆符号的整数类型,Uint32)存储 Unix 时间戳)。允许存储与 Date 类型相同的范围内的值。最⼩值为 1970-
01-01 00:00:00。时间戳类型值精确到秒(没有闰秒)。
DateTime 类型包含时、分、秒信息,精确到秒,⽀持使⽤字符串形式写⼊。
总结:
A、因为是Unsigned的整形,因此不能⽀持1970年1⽉1⽇(UTC/GMT的午夜)以前的时间。
B、时区会影响输⼊和输出。请使–u_client_time_zone 进⾏切换时区,服务端启动时候最好使⽤TZ=X 来保证时区
-- 建表
create table datetime_test(
c1 DateTime
) engine = Memory;
-- 插⼊数据
inrt into datetime_test values('2021-04-25 10:20:30');
--查询
lect c1, toTypeName(c1) from datetime_test;
1.3.3. DateTime64类型
DateTime64 可以记录亚秒,它在 DateTime 之上增加了精度的设置,例如:
-- 建表
drop table if exists datetime64_test; create table datetime64_test(
c1 DateTime64(2),
c2 DateTime64(4)
)
人民的名义导演
engine = Memory;
-- 插⼊数据
inrt into datetime64_test (c1, c2) values('2021-04-25 10:20:30', '2021-04-25 10:20:30.333');
--查询
lect c1, toTypeName(c1), c2, toTypeName(c2) from datetime64_test;
1.4. 复合类型
除了基础数据类型之外,ClickHou 还提供了数组、元组、枚举和嵌套四类复合类型。这些类型通常是其他数据库原⽣不具备的特性。拥有了复合类型之后,ClickHou 的数据模型表达能⼒更强了。
1.4.1. 枚举类型

本文发布于:2023-07-26 19:49:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1097782.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   时间   精度   时候
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图