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)
运算符<
- Decimal64(S1)

本文详细介绍了ClickHouse的各种数据类型,包括数值类型(Int、浮点、Decimal)、字符串类型(String、FixedString、UUID)、日期类型(Date、DateTime)、布尔类型、数组类型、枚举类型、Tuple以及特殊数据类型(Nullable、Domain)。着重阐述了Decimal类型的精度和规模规则,以及不同数据类型之间的运算规则。
最低0.47元/天 解锁文章
890

被折叠的 条评论
为什么被折叠?



