ClickHouse提供了许多数据类型,它们可以划分为基础类型、复合类型和特殊类型。我们可以在system.data_type_families
表中检查数据类型名称以及是否区分大小写。
SELECT * FROM system.data_type_families
上面的系统表,存储了ClickHouse所支持的数据类型,注意不同版本的ClickHouse可能数据类型会有所不同,具体如下表所示:
┌─name────────────────────┬─case_insensitive─┬─alias_to────┐
│ IPv6 │ 0 │ │
│ IPv4 │ 0 │ │
│ LowCardinality │ 0 │ │
│ Decimal │ 1 │ │
│ String │ 0 │ │
│ Decimal64 │ 1 │ │
│ Decimal32 │ 1 │ │
│ Decimal128 │ 1 │ │
│ Float64 │ 0 │ │
│ Float32 │ 0 │ │
│ Int64 │ 0 │ │
│ SimpleAggregateFunction │ 0 │ │
│ Array │ 0 │ │
│ Nothing │ 0 │ │
│ UInt16 │ 0 │ │
│ Enum16 │ 0 │ │
│ UInt32 │ 0 │ │
│ Date │ 1 │ │
│ Int8 │ 0 │ │
│ Int32 │ 0 │ │
│ Enum8 │ 0 │ │
│ UInt64 │ 0 │ │
│ IntervalSecond │ 0 │ │
│ Int16 │ 0 │ │
│ FixedString │ 0 │ │
│ Nullable │ 0 │ │
│ AggregateFunction │ 0 │ │
│ DateTime │ 1 │ │
│ Enum │ 0 │ │
│ Tuple │ 0 │ │
│ IntervalMonth │ 0 │ │
│ Nested │ 0 │ │
│ IntervalMinute │ 0 │ │
│ IntervalHour │ 0 │ │
│ IntervalWeek │ 0 │ │
│ IntervalDay │ 0 │ │
│ UInt8 │ 0 │ │
│ IntervalQuarter │ 0 │ │
│ UUID │ 0 │ │
│ IntervalYear │ 0 │ │
│ LONGBLOB │ 1 │ String │
│ MEDIUMBLOB │ 1 │ String │
│ TINYBLOB │ 1 │ String │
│ BIGINT │ 1 │ Int64 │
│ SMALLINT │ 1 │ Int16 │
│ TIMESTAMP │ 1 │ DateTime │
│ INTEGER │ 1 │ Int32 │
│ INT │ 1 │ Int32 │
│ DOUBLE │ 1 │ Float64 │
│ MEDIUMTEXT │ 1 │ String │
│ TINYINT │ 1 │ Int8 │
│ DEC │ 1 │ Decimal │
│ BINARY │ 1 │ FixedString │
│ FLOAT │ 1 │ Float32 │
│ CHAR │ 1 │ String │
│ VARCHAR │ 1 │ String │
│ TEXT │ 1 │ String │
│ TINYTEXT │ 1 │ String │
│ LONGTEXT │ 1 │ String │
│ BLOB │ 1 │ String │
└─────────────────────────┴──────────────────┴─────────────┘
数值类型
Int类型
固定长度的整数类型又包括有符号和无符号的整数类型。
- 有符号整数类型
类型 | 字节 | 范围 |
---|---|---|
Int8 | 1 | [-2^7 ~2^7-1] |
Int16 | 2 | [-2^15 ~ 2^15-1] |
Int32 | 4 | [-2^31 ~ 2^31-1] |
Int64 | 8 | [-2^63 ~ 2^63-1] |
Int128 | 16 | [-2^127 ~ 2^127-1] |
Int256 | 32 | [-2^255 ~ 2^255-1] |
- 无符号类型
类型 | 字节 | 范围 |
---|---|---|
UInt8 | 1 | [0 ~2^8-1] |
UInt16 | 2 | [0 ~ 2^16-1] |
UInt32 | 4 | [0 ~ 2^32-1] |
UInt64 | 8 | [0 ~ 2^64-1] |
UInt256 | 32 | [0 ~ 2^256-1] |
浮点类型
- 单精度浮点数
Float32从小数点后第8位起会发生数据溢出
类型 | 字节 | 精度 |
---|---|---|
Float32 | 4 | 7 |
- 双精度浮点数
Float32从小数点后第17位起会发生数据溢出
类型 | 字节 | 精度 |
---|---|---|
Float64 | 8 | 16 |
- 示例
-- Float32类型,从第8为开始产生数据溢出
kms-1.apache.com :) select toFloat32(0.123456789);
SELECT toFloat32(0.123456789)
┌─toFloat32(0.123456789)─┐
│ 0.12345679 │
└────────────────────────┘
-- Float64类型,从第17为开始产生数据溢出
kms-1.apache.com :) select toFloat64(0.12345678901234567890);
SELECT toFloat64(0.12345678901234568)
┌─toFloat64(0.12345678901234568)─┐
│ 0.12345678901234568 │
└────────────────────────────────┘
Decimal类型
有符号的定点数,可在加、减和乘法运算过程中保持精度。ClickHouse提供了Decimal32、Decimal64和Decimal128三种精度的定点数,支持几种写法:
-
Decimal(P, 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) )
-
Decimal256(S)
数据范围:( -1 * 10^(76 - S), 1 * 10^(76 - S) )
其中:P代表精度,决定总位数(整数部分+小数部分),取值范围是1~76
S代表规模,决定小数位数,取值范围是0~P
根据P的范围,可以有如下的等同写法:
P 取值 | 原生写法示例 | 等同于 |
---|---|---|
[ 1 : 9 ] | Decimal(9,2) | Decimal32(2) |
[ 10 : 18 ] | Decimal(18,2) | Decimal64(2) |
[ 19 : 38 ] | Decimal(38,2) | Decimal128(2) |
[ 39 : 76 ] | Decimal(76,2) | Decimal256(2) |
注意点:不同精度的数据进行四则运算时,**精度(总位数)和规模(小数点位数)**会发生变化,具体规则如下:
-
精度对应的规则
- Decimal64(S1)
运算符
Decimal32(S2) -> Decimal64(S) - Decimal128(S1)
运算符
Decimal32(S2) -> Decimal128(S) - Decimal128(S1)
运算符
Decimal64(S2) -> Decimal128(S) - Decimal256(S1)
运算符
Decimal<32|64|128>(S2) -> Decimal256(S)
可以看出:两个不同精度的数据进行四则运算时,结果数据已最大精度为准
- Decimal64(S1)
-
规模(小数点位数)对应的规则
- 加法|减法:S = max(S1, S2),即以两个数据中小数点位数最多的为准
- 乘法: S = S1 + S2(注意:S1精度 >= S2精度),即以两个数据的小数位相加为准
-
除法: S = S1,即被除数