篇三|ClickHouse的数据类型

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)

    可以看出:两个不同精度的数据进行四则运算时,结果数据已最大精度为准

  • 规模(小数点位数)对应的规则

    • 加法|减法:S = max(S1, S2),即以两个数据中小数点位数最多的为准
    • 乘法: S = S1 + S2(注意:S1精度 >= S2精度),即以两个数据的小数位相加为准
  • 除法: S = S1,即被除数

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值