本文是clickhouse专栏第五篇,更多内容请关注本号历史文章!
clickhouse内置了很多的column数据类型,可以通过查询system.data_type_families
这张表获取版本的所有支持的数据类型。下文中第一列是字段类型,第二列表示该类型的字段类型是否区分大小写(1表示不区分大小写,Date和date都是有效的数据类型名称),第三类是该字段类型的别名。
peer1 :) SELECT * FROM system.data_type_families; ┌─name────────────────────────────┬─case_insensitive─┬─alias_to────┐ │ Polygon │ 0 │ │ │ Ring │ 0 │ │ │ Point │ 0 │ │ │ MultiPolygon │ 0 │ │ │ IPv6 │ 0 │ │ │ IntervalSecond │ 0 │ │ │ IPv4 │ 0 │ │ │ UInt32 │ 0 │ │ │ IntervalYear │ 0 │ │ │ IntervalQuarter │ 0 │ │ │ IntervalMonth │ 0 │ │ │ Int64 │ 0 │ │ │ IntervalDay │ 0 │ │ │ IntervalHour │ 0 │ │ │ UInt256 │ 0 │ │ │ Int16 │ 0 │ │ │ LowCardinality │ 0 │ │ │ AggregateFunction │ 0 │ │ │ Nothing │ 0 │ │ │ Decimal256 │ 1 │ │ │ Tuple │ 0 │ │ │ Array │ 0 │ │ │ Enum16 │ 0 │ │ │ IntervalMinute │ 0 │ │ │ FixedString │ 0 │ │ │ String │ 0 │ │ │ DateTime │ 1 │ │ │ Map │ 0 │ │ │ UUID │ 0 │ │ │ Decimal64 │ 1 │ │ │ Nullable │ 0 │ │ │ Enum │ 0 │ │ │ Int32 │ 0 │ │ │ UInt8 │ 0 │ │ │ Date │ 1 │ │ │ Decimal32 │ 1 │ │ │ UInt128 │ 0 │ │ │ Float64 │ 0 │ │ │ SimpleAggregateFunction │ 0 │ │ │ Nested │ 0 │ │ │ DateTime64 │ 1 │ │ │ Int128 │ 0 │ │ │ Decimal128 │ 1 │ │ │ Int8 │ 0 │ │ │ Decimal │ 1 │ │ │ Int256 │ 0 │ │ │ IntervalWeek │ 0 │ │ │ UInt64 │ 0 │ │ │ Enum8 │ 0 │ │ │ DateTime32 │ 1 │ │ │ UInt16 │ 0 │ │ │ Float32 │ 0 │ │ │ INET6 │ 1 │ IPv6 │ │ INET4 │ 1 │ IPv4 │ │ BINARY │ 1 │ FixedString │ │ NATIONAL CHAR VARYING │ 1 │ String │ │ BINARY VARYING │ 1 │ String │ │ NCHAR LARGE OBJECT │ 1 │ String │ │ NATIONAL CHARACTER VARYING │ 1 │ String │ │ NATIONAL CHARACTER LARGE OBJECT │ 1 │ String │ │ NATIONAL CHARACTER │ 1 │ String │ │ NATIONAL CHAR │ 1 │ String │ │ CHARACTER VARYING │ 1 │ String │ │ LONGBLOB │ 1 │ String │ │ MEDIUMTEXT │ 1 │ String │ │ TEXT │ 1 │ String │ │ TINYBLOB │ 1 │ String │ │ VARCHAR2 │ 1 │ String │ │ CHARACTER LARGE OBJECT │ 1 │ String │ │ DOUBLE PRECISION │ 1 │ Float64 │ │ LONGTEXT │ 1 │ String │ │ NVARCHAR │ 1 │ String │ │ INT1 UNSIGNED │ 1 │ UInt8 │ │ VARCHAR │ 1 │ String │ │ CHAR VARYING │ 1 │ String │ │ MEDIUMBLOB │ 1 │ String │ │ NCHAR │ 1 │ String │ │ CHAR │ 1 │ String │ │ SMALLINT UNSIGNED │ 1 │ UInt16 │ │ TIMESTAMP │ 1 │ DateTime │ │ FIXED │ 1 │ Decimal │ │ TINYTEXT │ 1 │ String │ │ NUMERIC │ 1 │ Decimal │ │ DEC │ 1 │ Decimal │ │ TINYINT UNSIGNED │ 1 │ UInt8 │ │ INTEGER UNSIGNED │ 1 │ UInt32 │ │ INT UNSIGNED │ 1 │ UInt32 │ │ CLOB │ 1 │ String │ │ MEDIUMINT UNSIGNED │ 1 │ UInt32 │ │ BOOL │ 1 │ Int8 │ │ SMALLINT │ 1 │ Int16 │ │ INTEGER SIGNED │ 1 │ Int32 │ │ NCHAR VARYING │ 1 │ String │ │ INT SIGNED │ 1 │ Int32 │ │ TINYINT SIGNED │ 1 │ Int8 │ │ BIGINT SIGNED │ 1 │ Int64 │ │ BINARY LARGE OBJECT │ 1 │ String │ │ SMALLINT SIGNED │ 1 │ Int16 │ │ MEDIUMINT │ 1 │ Int32 │ │ INTEGER │ 1 │ Int32 │ │ INT1 SIGNED │ 1 │ Int8 │ │ BIGINT UNSIGNED │ 1 │ UInt64 │ │ BYTEA │ 1 │ String │ │ INT │ 1 │ Int32 │ │ SINGLE │ 1 │ Float32 │ │ FLOAT │ 1 │ Float32 │ │ MEDIUMINT SIGNED │ 1 │ Int32 │ │ BOOLEAN │ 1 │ Int8 │ │ DOUBLE │ 1 │ Float64 │ │ INT1 │ 1 │ Int8 │ │ CHAR LARGE OBJECT │ 1 │ String │ │ TINYINT │ 1 │ Int8 │ │ BIGINT │ 1 │ Int64 │ │ CHARACTER │ 1 │ String │ │ BYTE │ 1 │ Int8 │ │ BLOB │ 1 │ String │ │ REAL │ 1 │ Float32 │ └─────────────────────────────────┴──────────────────┴─────────────┘
clickhouse和传统的数据库一样,提供了基础的数据类型,这一部分就简单的介绍一下,相信学过编程语言的同学对这一部分并不陌生。
整数类型,IntN随着N的增大,整型数值的范围扩大。U表示unsigned无符号,无符号就是没有负数符号,只能存储大于等于0的树。
单精度浮点数Float32,学过C、java、mysql的朋友把它当作float数据类型使用即可。从小数点后第8位起会发生精度丢失。
双精度浮点数Float64,学过C、java、mysql的朋友把它当作double数据类型使用即可。从小数点后第17位起会发生精度丢失。
有的时候Float32、Float64无法满足计算精度的要求,我们就需要使用Decimal数据类型。ClickHouse 提供了 Decimal32、Decimal64 和 Decimal128 三种精度的Decimal。
在定义表字段的类型时,可以通过两种形式声明:简写方式有 Decimal32(S)、Decimal64(S)、Decimal128(S) 三种,原生方式为 Decimal(P, S),表示该定点数的整数位加上小数位的总长度最大为 P,其中小数位长度最多为 S。
参考下面的SQL及输出结果进行理解和学习
SELECT toDecimal64(2, 3) AS x, --数值为2,精度为3,所以2.000 toTypeName(x) AS xtype, toDecimal32(2, 2) AS y, --数值为2,精度为2,所以2.00 toTypeName(y) as ytype, x + y AS a, --2.000 + 2.00,加减法取最大精度。所以4.000 toTypeName(a) AS atype, x * y AS b, --2.000*2.00,乘法的精度值相加(2+3=5)。所以4.00000 toTypeName(b) AS btype, x / y AS c, --2.000/2.00,被除数2.000精度是3,结果精度等于被除数精度。所以1.000 toTypeName(c) AS ctype;
下图为上面的SQL的执行结果
clickhouse 中的String类型并没有长度限制,所以它可以代替传统关系型数据库中的所有以字符形式存在的数据类型,如:CHAR、VARCHAR、CLOB 等等。
FixedString(N)表示固定长度为N的数据类型,可以使用toFixedString函数将String转换成FixedString。下文中的SQL虽然zimug
长度是5,但使用FixedString(6)长度为6,实际存储内容是zimug\0
。
peer1 :) select toFixedString('zimug', 6), length(toFixedString('zimug', 6)); ┌─toFixedString('zimug', 6)─┬─length(toFixedString('zimug', 6))─┐ │ zimug │ 6 │ └───────────────────────────┴───────────────────────────────────┘
UUID是比较常见的数据唯一值,ClickHouse把它作为一种数据类型。UUID数据格式如:6fb875ae-75b9-4643-a146-5a1de7c717b4
,使用方式如下:
使用示例如下:
-- 建表时创建UUID数据类型字段 CREATE TABLE test_uuid (id UUID, content String) ENGINE=TinyLog; -- 向表中插入数据 INSERT INTO test_uuid SELECT generateUUIDv4(), 'test uuid 1'; -- 插入的时候不为UUID赋值,UUID字段使用0填充 INSERT INTO test_uuid (content) VALUES ('test uuid 2');
日期数据类型有三种:DateTime、DateTime64和Date,并且支持使用字符串的方式insert写入日期格式。另外还有一种日期类型TIMESTAMP ,其使用方法和DateTime类型一摸一样,只是对DateTime数据类型起了一个别名。
ClickHouse布尔数据类型BOOLEAN 。其实际存储就是使用UInt8 类型,取值限制为0或 1。