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小时内删除。