大数据(5n)ClickHouse常见数据类型
Posted 小基基o_O
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据(5n)ClickHouse常见数据类型相关的知识,希望对你有一定的参考价值。
文章目录
本文版本
ClickHouse client version 21.4.6.55 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.4.6 revision 54447.
整数
整数 | 范围 | 别称 |
---|---|---|
Int8 | -128~127 | TINYINT |
Int16 | -32768~32767 | SMALLINT |
Int32 | -2147483648~2147483647 | INTEGER、INT |
Int64 | -263~263-1 | BIGINT |
Int128 | -2127~2127-1 | |
Int256 | -2255~2255-1 |
非负整数 | 范围 |
---|---|
UInt8 | 0~255 |
UInt16 | 0~65535 |
UInt32 | 0~4294967295 |
UInt64 | 0~264-1 |
UInt128 | 0~2128-1 |
UInt256 | 0~2256-1 |
浮点数
浮点数 | 别称 |
---|---|
Float32 | FLOAT |
Float64 | DOUBLE |
浮点数的计算可能会产生舍入误差
SELECT 1 - 0.9;
┌───────minus(1, 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘
浮点数的计算可能会产生无穷大(Inf
)和非数字(NaN
)
SELECT -0.5 / 0;
┌─divide(-0.5, 0)─┐
│ -inf │
└─────────────────┘
SELECT 0 / 0;
┌─divide(0, 0)─┐
│ nan │
└──────────────┘
十进制小数
P | 精度(位数) |
---|---|
Decimal32 | 9 |
Decimal64 | 18 |
Decimal128 | 38 |
Decimal256 | 76 |
S | 范围 |
---|---|
Decimal32(S) | − 1 × 1 0 ( 9 − S ) -1 \\times 10^(9 - S) −1×10(9−S) ~ 1 × 1 0 ( 9 − S ) 1 \\times 10^(9 - S) 1×10(9−S) |
Decimal64(S) | − 1 × 1 0 ( 18 − S ) -1 \\times 10^(18 - S) −1×10(18−S) ~ 1 × 1 0 ( 18 − S ) 1 \\times 10^(18 - S) 1×10(18−S) |
Decimal128(S) | − 1 × 1 0 ( 38 − S ) -1 \\times 10^(38 - S) −1×10(38−S) ~ 1 × 1 0 ( 38 − S ) 1 \\times 10^(38 - S) 1×10(38−S) |
Decimal256(S) | − 1 × 1 0 ( 76 − S ) -1 \\times 10^(76 - S) −1×10(76−S) ~ 1 × 1 0 ( 76 − S ) 1 \\times 10^(76 - S) 1×10(76−S) |
例如,
Decimal32(4)
范围:-99999.9999
~99999.9999
,步长为0.0001
在加减法运算期间保持精度的有符号定点数
SELECT 1 - toDecimal64(0.9,2);
┌─minus(1, toDecimal64(0.9, 2))─┐
│ 0.10 │
└───────────────────────────────┘
对于乘法,可能会发生位数溢出(如下示例,5+5>9)
SELECT toDecimal32(4.2, 5) AS x, x * x;
Scale 10 is out of bounds
对于除法,可能会丢失小数位的精度(截断)
SELECT toDecimal32(2, 4) AS x, x / 3;
┌──────x─┬─divide(toDecimal32(2, 4), 3)─┐
│ 2.0000 │ 0.6666 │
└────────┴──────────────────────────────┘
乘法或加法可能会导致溢出
SELECT toDecimal32(9.9, 8) AS x, x + 20;
Decimal math overflow
boolean
bool
类型以UInt8
存储
CREATE TABLE test_bool(`b` Bool)ENGINE=Memory;
SHOW CREATE TABLE test_bool;
┌─statement───────────────────────────────────────────────────┐
│ CREATE TABLE default.test_bool
(
`b` Int8
)
ENGINE = Memory │
└─────────────────────────────────────────────────────────────┘
字符串
- String
任意长度的字符串,长度不限
字符串可以包含任意一组字节,这些字节被按原样存储和输出,包括空字节
如果需要存储文本,我们建议使用UTF-8编码
length
函数以字节为单位计算字符串长度,而lengthUTF8
函数以Unicode编码点为单位计算字符串长度
SELECT length('大')
┌─length('大')─┐
│ 3 │
└──────────────┘
SELECT lengthUTF8('大')
┌─lengthUTF8('大')─┐
│ 1 │
└──────────────────┘
- FixedString
定长字符串
FixedString(N)
,N
是正整数
如果字符串少于N
个字节,则用空字节填补尾部
如果字符串长于N
个字节,则报错
日期、时间、时间戳
- Date
范围:1970-01-01
~2149-06-06
大小:2bytes - Date32
范围:1900-01-01
~2299-12-31
大小:4bytes - DateTime
DateTime([timezone])
范围:1970-01-01 00:00:00
~2106-02-07 06:28:15
分辨率:1秒 - Datetime64
DateTime64(precision, [timezone])
,precision
常用3(milliseconds)或6(microseconds)
范围:1900-01-01 00:00:00
~2299-12-31 23:59:59.99999999
日期
-- 今天
SELECT today()
-- 昨天
SELECT today() - toIntervalDay(1)
┌─minus(today(), toIntervalDay(1))─┐
│ 2022-09-20 │
└──────────────────────────────────┘
-- 支持 等于字符串的写法
SELECT today() = '2022-09-21'
┌─equals(today(), '2022-09-21')─┐
│ 1 │
└───────────────────────────────┘
时间
-- 现在
SELECT now() AS x, toTypeName(x);
┌───────────────────x─┬─toTypeName(now())─┐
│ 2022-09-21 21:59:02 │ DateTime │
└─────────────────────┴───────────────────┘
-- 转字符串
SELECT formatDateTime(now(), '%Y-%m-%d %T')
┌─formatDateTime(now(), '%Y-%m-%d %T')─┐
│ 2022-09-21 22:03:16 │
└──────────────────────────────────────┘
时区
SELECT timeZoneOf(now())
┌─timeZoneOf(now())─┐
│ Asia/Shanghai │
└───────────────────┘
时间戳
SELECT FROM_UNIXTIME(0);
-- 返回DateTime类型
┌────FROM_UNIXTIME(0)─┐
│ 1970-01-01 08:00:00 │
└─────────────────────┘
SELECT toUnixTimestamp('1970-01-01 08:00:00', 'Asia/Shanghai')
-- 返回UInt32类型
┌─toUnixTimestamp('1970-01-01 08:00:00', 'Asia/Shanghai')─┐
│ 0 │
└─────────────────────────────────────────────────────────┘
枚举
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
x Enum('总'=0, '大类'=1, '中类'=2, '小类'=3)
)ENGINE = TinyLog;
INSERT INTO t1 VALUES ('总'),('小类'),('大类');
SELECT x,CAST(x,'Int8') FROM t1;
┌─x────┬─CAST(x, 'Int8')─┐
│ 总 │ 0 │
│ 小类 │ 3 │
│ 大类 │ 1 │
└──────┴─────────────────┘
数组
array(T)
SELECT array(1, 2) AS x, toTypeName(x);
┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8) │
└───────┴─────────────────────────┘
-- 方括号写法
SELECT [1, 2, NULL] AS x, toTypeName(x);
┌─x──────────┬─toTypeName([1, 2, NULL])─┐
│ [1,2,NULL] │ Array(Nullable(UInt8)) │
└────────────┴──────────────────────────┘
以上是关于大数据(5n)ClickHouse常见数据类型的主要内容,如果未能解决你的问题,请参考以下文章