整数类型
这里分为有符号整型和无符号整型,以下是它取值范围:
有符号整型:
Int8 — [-128 : 127]
Int16 — [-32768 : 32767]
Int32 — [-2147483648 : 2147483647]
Int64 — [-9223372036854775808 : 9223372036854775807]
Int128 — [-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727]
Int256 — [-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967]
无符号整型:
UInt8 — [0 : 255]
UInt16 — [0 : 65535]
UInt32 — [0 : 4294967295]
UInt64 — [0 : 18446744073709551615]
UInt128 — [0 : 340282366920938463463374607431768211455]
UInt256 — [0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935]
示例:
create table test_int(co1 Int8,co2 Int16,co3 UInt8) engine=Memory;
insert into test_int values (-128,32767,255);
浮点数类型
float32:对应float类型
float64:对应double类型
-Inf:负无穷
Inf:正无穷
NaN:非数字
示例:
create tabel test_float(co1 Float32,co2 Flaot64)engine=Memory;
insert into test_float values (0.123456789,0.1234567890123456789);
这里需要注意float32和float64分别对应小数点后8位和16位有效数字,溢出来的精度会被四舍五入。
select (0.5/0) f1,(-0.5/0) f2,(0/0) f3;
decimal数据类型
写法:Decimal(P,S)
P - 精度。有效范围:[1:38],决定可以有多少个十进制数字(包括分数)。
S - 规模。有效范围:[0:P],决定数字的小数部分中包含的小数位数。
P从[1:9]对应Decimal32(S)
P从[10:18]对应Decimal64(S)
P从[19:38]对应Decimal128(S)
对应取值范围:
Decimal32(S) -> ( -1 * 10^(9 - S),1*10^(9-S) )
Decimal64(S) -> ( -1 * 10^(18 - S),1*10^(18-S) )
Decimal128(S) -> ( -1 * 10^(38 - S),1*10^(38-S) )
示例:
create table test_decimal(co1 Decimal32(4),co2 Decimal64(5),co3 Decimal128(6))engine=Memory;
insert into test_decimal values (1,2,3);
select (co1+co2) as f1,toTypeName(f1), (co1*co3) as f2,toTypeName(f2) from test_decimal;
这里需要注意的是,decimal在进行四则运算的时候小数位数取最高的一个数字,乘法运算除外。两个数字相乘小数位数等于s1+s1的和。而精度都是取最高精度的一个数字。
另外小数位数超过当前限制,会导致精度溢出,这里溢出不会四舍五入,会直接丢弃掉。整数位数过多会直接报错。
布尔类型
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。
示例:
select (1==2) f1, (1==1) f2;
字符串
String:普通字符串,不限制长度
FixedString(N):固定长度N的字符串
UUID:16字节的数字,用于标识记录
示例:
create table test_string(co1 String,co2 FixedString(4),co3 UUID)engine=Memory;
insert into test_string values ('sddfffssss','qwer',generateUUIDv4());
时间类型
Date32:返回yyyy-MM-dd格式
DateTime64(precision, [timezone]): 返回yyyy-MM-dd HH:mm:ss格式。precision表示时间刻度的分辨率(最大精度为8),timezone表示时区。DateTime64(8)表示0000-00-00 23:59:59.99999999.
日期:值的范围 => [1970-01-01, 2149-06-06]
日期时间:值的范围 => [1970-01-01 00:00:00, 2106-02-07 06:28:15]
示例:
create table test_date(co1 Date,co2 DateTime,co3 Date32,co4 DateTime64(3,'Asia/Shanghai'),co5 DateTime64(2,'America/Los_Angeles'))engine=Memory;
insert into test_date values ('2023-10-10','2023-10-10 10:00:00','2023-10-01','2023-10-10 10:00:00','2023-10-10 10:00:00'),(1692583808,1692583808,1692583808,1692583808000,169258380800);
这里需要注意的是:时间戳的书写,默认datetime类型时间戳是10位,但我指定test_date表中co4字段精度为3,则需要再在1692583808时间戳后面加三个0,co5也是如此。
数组类型
定义方式;array(T)或者[]
获取元素值:arrayElement(数组名称,下标索引)
示例:
SELECT array(1, 2, NULL) x ,['a','b'] y, arrayElement(y,1) z;
元组类型
tuple(T1, T2, ...)其中每个元素可以是不同类型
元组只能定义在内存表中,即engine=Memory
示例:
select tuple(1,'a') f,f.1,f.2;
嵌套数据结构
Nested关键字进行声明
只支持一级嵌套
MergeTree 引擎中不支持嵌套存储
示例:
create table test_nested(name String,age Int8, works Nested(id UInt8,localation String))engine=Memory;
insert into test_nested values('zs',22,[1],['bj']),('ls',23,[2,3],['sh','xn']);
低基度类型
通过LowCardinality关键字声明:LowCardinality(data_type)
其中data_type包括: String, FixedString, Date, DateTime,数字类型,但decimal类型除外。
ClickHouse会把 LowCardinality 所在的列进行字典编码。对很多应用来说,处理字典编码的数据可以显著的增加SELECT查询速度。
示例:
CREATE TABLE test_lc
(
`id` UInt16,
`name` LowCardinality(String)
)
ENGINE = MergeTree();
坐标数据类型
point:存储坐标(x,y),等效于tuple(Float64,Float64)
Ring:存储一组坐标,存储类型为一维数组
Polygon:存储一组坐标,存储类型为多维数组
MultiPolygon:存储一组坐标,存储类型为多维嵌套数组,他要比Polygon功能更强
示例:
create table test_geo(co1 Point,co2 Ring, co3 Polygon,co4 MultiPolygon)engine=Memory;
insert into test_geo values(
(10,10),
([(0, 0), (10, 0), (10, 10), (0, 10)]),
([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, 30), (50, 50), (50, 30)]]),
([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]])
);
map类型
Map(key, value) 可以存储 key:value 键值对类型的数据
key —> 键值对的key,类型可以是:String, Integer, LowCardinality, 或者 FixedString.
value —> 键值对的value,类型可以是:String, Integer, Array, LowCardinality, 或者 FixedString.
示例:
CREATE TABLE test_map (a Map(String, UInt64)) ENGINE=Memory;
INSERT INTO test_map VALUES ({'key1':1, 'key2':10}), ({'key1':2,'key2':20}), ({'key1':3,'key2':30});
IP地址类型
ipv4:更为紧凑的二进制存储IPv4地址的值,可以和UInt32类型相互转化
ipv6:更为紧凑的二进制存储IPv6地址的值,可以和FixedString(16)类型相互转化
示例:
create table sf_ip(co1 IPv4,co2 IPv6)engine=Memory;
insert into sf_ip values ('116.253.40.133','2001:44c8:129:2632:33:0:252:2');
转换方法:
CAST(co1 as UInt32)
CAST(co2 as FixedString(16))