clickhouse基本数据类型
clickhouse有数值类型(整形,浮点数,定点数),字符串类型,⽇期时间类型,还有⼀些特别的数据类型。没有Boolean类型,但是可以⽤整形的0和1替代。使⽤UInt即可。
0.⽀持的数据类型:
:) select * from system.data_type_families ;
┌─name────────────────────┬─case_insensitive─┬─alias_to────┐
│ IPv6 │ 0 ││
│ IPv4 │ 0 ││
│ IntervalYear │ 0 ││
│ IntervalQuarter │ 0 ││
│ IntervalMonth │ 0 ││
│ IntervalDay │ 0 ││
│ IntervalHour │ 0 ││
│ IntervalSecond │ 0 ││
│ AggregateFunction │ 0 ││
│ Nothing │ 0 ││
│ Tuple │ 0 ││
│ Array │ 0 ││
│ Nullable │ 0 ││
│ Int32 │ 0 ││
│ Date │ 1 ││
│ Enum │ 0 ││
│ Enum8 │ 0 ││
│ IntervalMinute │ 0 ││
│ FixedString │ 0 ││
│ LowCardinality │ 0 ││
│ String │ 0 ││
│ DateTime │ 1 ││
│ UUID │ 0 ││
│ Decimal64 │ 1 ││
│ Decimal32 │ 1 ││
│ Float64 │ 0 ││
│ Int16 │ 0 ││
│ DateTime64 │ 1 ││
│ Decimal128 │ 1 ││
│ Int8 │ 0 ││
│ SimpleAggregateFunction │ 0 ││
│ Nested │ 0 ││
│ Int64 │ 0 ││
│ Decimal │ 1 ││
│ IntervalWeek │ 0 ││
│ UInt64 │ 0 ││
│ Enum16 │ 0 ││
│ UInt32 │ 0 ││
│ UInt16 │ 0 ││
│ Float32 │ 0 ││
│ UInt8 │ 0 ││
│ BINARY │ 1 │ FixedString │
│ LONGBLOB │ 1 │ String │
│ LONGTEXT │ 1 │ String │
│ TINYTEXT │ 1 │ String │
│ TEXT │ 1 │ String │
│ TINYINT │ 1 │ Int8 │
│ DEC │ 1 │ Decimal │
│ VARCHAR │ 1 │ String │
│ MEDIUMBLOB │ 1 │ String │
│ TIMESTAMP │ 1 │ DateTime │
│ BLOB │ 1 │ String │
│ FLOAT │ 1 │ Float32 │
│ INTEGER │ 1 │ Int32 │
│ DOUBLE │ 1 │ Float64 │
│ BIGINT │ 1 │ Int64 │
│ TINYBLOB │ 1 │ String │
│ CHAR │ 1 │ String │
│ MEDIUMTEXT │ 1 │ String │
│ INT │ 1 │ Int32 │
│ SMALLINT │ 1 │ Int16 │
└─────────────────────────┴──────────────────┴─────────────┘
61 rows in set. Elapsed: 0.002 sec.
hadoop101 :) select * from system.data_type_families where case_insensitive=1;
┌─name───────┬─case_insensitive─┬─alias_to────┐
│ Date │ 1 ││
│ DateTime │ 1 ││
│ Decimal64 │ 1 ││
│ Decimal32 │ 1 ││
│ DateTime64 │ 1 ││
│ Decimal128 │ 1 ││
│ Decimal │ 1 ││
│ BINARY │ 1 │ FixedString │
│ LONGBLOB │ 1 │ String │
│ LONGTEXT │ 1 │ String │
│ TINYTEXT │ 1 │ String │
│ TEXT │ 1 │ String │
│ TINYINT │ 1 │ Int8 │
│ DEC │ 1 │ Decimal │
│ VARCHAR │ 1 │ String │
│ MEDIUMBLOB │ 1 │ String │
│ TIMESTAMP │ 1 │ DateTime │
│ BLOB │ 1 │ String │
│ FLOAT │ 1 │ Float32 │
│ INTEGER │ 1 │ Int32 │
│ DOUBLE │ 1 │ Float64 │
│ BIGINT │ 1 │ Int64 │
│ TINYBLOB │ 1 │ String │
│ CHAR │ 1 │ String │
│ MEDIUMTEXT │ 1 │ String │
│ INT │ 1 │ Int32 │
│ SMALLINT │ 1 │ Int16 │
└────────────┴──────────────────┴─────────────┘
27 rows in set. Elapsed: 0.015 sec.
可以看到⽀持61中数据类型,有20种数据类型是为了兼容其他数据库的类型,主要是兼容MySQL的数据类型。case_insensitive 选项为1 表⽰⼤⼩写不敏感,字段类型不区分⼤⼩写
为0 表⽰⼤⼩写敏感,即字段类型需要严格区分⼤⼩写。
1.整形
Clickhouse是使⽤C和C++类型写的,数据类型和C语⾔的类型息息相关。
1.1 Int
整形区分为有符号和⽆符号类型的整数。
有符号类型:整型范围(-2^n-1~2^n-1 -1): 8位=1字节
MySQL Hive Clickhouse⼤⼩(字
数据范围
节)
tinyint tinyint Int81[-128 : 127]
smallint smallint Int162[-32768 : 32767]
int int Int323[-2147483648 : 2147483647]
bigint bigint Int644[-9223372036854775808 :
9223372036854775807]
⽆符号类型:
⽆符号类型:整形范围0~2^n-1
MySQL Hive Clickhouse⼤⼩
(字节)
数据范围
Tinyint
unsigned
UInt81[0 : 255]
smallint
unsigned
UInt162[0 : 65535]
Int unsigned UInt323[0 : 4294967295]
Bigint unsigned UInt644[0 :
18446744073709551615]
1.2 Float
MySQL Clickhouse⼤⼩字节有效精度(位数)
float Float3247
double Flout64816
clickhouse 直接使⽤Float32代表单精度浮点数 使⽤Float64表⽰双精度浮点数。
使⽤浮点数需要注意它的精度是有限的,Float32从⼩数点后第8位,Float64从⼩数点后的第17位起会产⽣数据溢出。
hadoop101 :) select toFloat32('0.12345678901234567890') as a,toTypeName(a);
┌──────────a─┬─toTypeName(toFloat32('0.12345678901234567890'))─┐
│ 0.12345679 │ Float32 │
└────────────┴─────────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.014 sec.
hadoop101 :) select toFloat64('0.12345678901234567890') as a,toTypeName(a);
┌───────────────────a─┬─toTypeName(toFloat64('0.12345678901234567890'))─┐
│ 0.12345678901234568 │ Float64 │
└─────────────────────┴─────────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.01
2 sec.
hadoop101 :) select 0.123456789123456789+0.987654321987654321 as b;
SELECT 0.12345678912345678 + 0.9876543219876543 AS b
┌──────────────────b─┐
│ 1.1111111111111112 │
└────────────────────┘
mysql创建表数据类型1 rows in set. Elapsed: 0.00
2 sec.
hadoop101 :) select 0.123456789+0.987654321 as a;
SELECT 0.123456789 + 0.987654321 AS a
┌──────────a─┐
│ 1.11111111 │
└────────────┘
clickhouse的浮点数⽀持正⽆穷,负⽆穷和⾮数字的表达⽅式:
select 1.0/0,-1/0,0/0;
┌─divide(1., 0)─┬─divide(-1, 0)─┬─divide(0, 0)─┐
│ inf │ -inf │ nan │
└───────────────┴───────────────┴──────────────┘
inf表⽰英⽂单词infinity NaN 表⽰not-a-number
使⽤浮点数进⾏数据运算会数据数据计算不准确的情形:
结论:Float32 和Float64 在数据精度较⾼的计算中会存在数据精度丢失,使⽤需谨慎。
1.3 Decimal
若需要要求更⾼的精度的数值运算,则需要使⽤定点数。Clickhouse提供了Decimal32,Decimal64,Decimal128三种精度的定点数。简写为Decimal32(S),Decimal64(S),Decimal128(S),原⽣⽅式为Decimal(P,S):
其中P表⽰精度precision,决定总位数(整数部分+⼩数位部分),取值范围为1--38
S代表规模 scale,决定⼩数位,取值范围是0--P。
简写⽅式和原⽣⽅式的对应表:
Decimal类型:
名称等效声明数据范围
Decimal32(S)Decimal(1-9,S)- ( -1 * 10^(9 - S), 1 * 10^(9 - S) ) Decimal64(S)Decimal(10-18,S)- ( -1 * 10^(18 - S), 1 * 10^(18 - S) ) Decimal128(S)Decimal(19-38,S)- ( -1 * 10^(38 - S), 1 * 10^(38 - S) )
MySQL Clickhouse
Decimal(9,2) Decimal32(2)
Decimal(22,6) Decimal128(6)
Decimal32(4) 表⽰的数据类型等同于MySQL的decimal(9,4)
数据范围为 -99999.9999 to 99999.9999 最⼩精度为0.0001
由于现代计算机只⽀持32bit和64bit,Decimal128在软件层⾯是由软件模拟实现,速度要⽐Decimal32和Decimal64慢。在适⽤不同精度的定点数进⾏四则运算的时候⼩数位会发⽣变化:
四则运算规则:
运算名称规则
加法S=max(S1,S2)
减法S=max(S1,S2)
乘法S=S1+S2(S1>=S2)
除法S=S1(S为分⼦,被除数,S1/S2)Decimal类型Overflow
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论