(1)整型
(2)固定长度的整型,包括有符号整型或无符号整型 IntX X是位的意思,1Byte字节=8bit位
有符号整型范围
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]
(3)浮点型(存在精度损失问题)
(4)Decimal类型
#测试Decimal类型
(1)创建数据库
CREATE DATABASE test
(2)创建表
CREATE TABLE test.product (
id UInt64,
name String,
time_stamp Date,
money Decimal(2,1)
)
ENGINE = MergeTree()
ORDER BY (time_stamp)
测试插入
INSERT INTO test.product
VALUES (568239, '商品1', '2021-10-02',2.11 )
(1)UUID
61f0c404-5cb3-11e7-907b-a6006ad3dba0
00000000-0000-0000-0000-000000000000
测试
(1)创建表
create TABLE t_uuid (x String,y String) ENGINE = TinyLog
(2)插入数据
INSERT INTO test.t_uuid SELECT generateUUIDv4(), 'Example 1'
(2)FixedString固定字符串类型
N
,将抛出Too large value for FixedString(N)
异常。FixedString
类型是高效的,在其他情况下,这可能会降低效率
(3)String字符串类型
字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
字符串类型可以代替其他 DBMSs中的 VARCHAR、BLOB、CLOB 等类型
ClickHouse 没有编码的概念,字符串可以是任意的字节集,按它们原本的方式进行存储和输出
Date
DateTime
DateTime64
Enum8
和 Enum16
类型,Enum
保存 'string'= integer
的对应关系Enum
数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String
数据类型更有效。
Enum8
用 'String'= Int8
对描述。Enum16
用 'String'= Int16
对描述。Enum8('ToBePaid' = 1, 'Paid' = 2)
类型的列
#插入成功
INSERT INTO test.pay_emun VALUES ('ToBePaid'), ('Paid')
#查询
SELECT * FROM test.pay_emun
#创建表
CREATE TABLE test.t_boolean (
time_stamp Date,
is_new Bool
)
ENGINE = MergeTree()
ORDER BY (time_stamp)
#插入,注意只能插入0或者1否则会报错,0表示false,1表示true
INSERT INTO test.t_boolean VALUES ('2021-10-02', 1)
INSERT INTO test.t_boolean VALUES ('2021-10-02', 0)
#查询
select * from test.t_boolean
#数据库中存储的数据类型,当然不止下图折磨多,具体用的时候再去看
select * from system.data_type_families
ClickHouse | Mysql | 说明 |
---|---|---|
UInt8 | UNSIGNED TINYINT | |
Int8 | TINYINT | |
UInt16 | UNSIGNED SMALLINT | |
Int16 | SMALLINT | |
UInt32 | UNSIGNED INT, UNSIGNED MEDIUMINT | |
Int32 | INT, MEDIUMINT | |
UInt64 | UNSIGNED BIGINT | |
Int64 | BIGINT | |
Float32 | FLOAT | |
Float64 | DOUBLE | |
Date | DATE | |
DateTime | DATETIME, TIMESTAMP | |
FixedString | BINARY |
(1)创建表
CREATE TABLE test.order (
customer_id String,
time_stamp Date,
click_event_type String,
page_code FixedString(20),
source_id UInt64,
money Decimal(2,1),
is_new Bool
)
ENGINE = MergeTree()
ORDER BY (time_stamp)
(2)查看表结构
DESCRIBE test.order
(3)查询
SELECT * FROM test.order
(4)插入
INSERT INTO test.order
VALUES ('customer2', '2021-10-02', 'add_to_cart', 'home_enter', 568239,2.1, False )
(5)更新和删除
在OLAP数据库中,可变数据(Mutable data)通常是不被欢迎的,早期ClickHouse是不支持,后来版本才有
不支持事务,建议批量操作,不要高频率小数据量更新删除
删除和更新是一个异步操作的过程,语句提交立刻返回,但不一定已经完成了
SELECT database, table, command, create_time, is_done FROM system.mutations LIMIT 20
注意事项
更新
ALTER TABLE test.order UPDATE click_event_type = 'pay' where customer_id = 'customer2';
ALTER TABLE test.order delete where customer_id = 'customer2';
区
- 如果更新100条数据,而这100条可能落在3个分区上,则需重建3个分区
- 相对来说一次更新一批数据的整体效率远高于一次更新一行
ALTER TABLE test.order UPDATE click_event_type = 'pay' where customer_id = 'customer2';
ALTER TABLE test.order delete where customer_id = 'customer2';