|NO.Z.00004|——————————|BigDataEnd|——|Hadoop&OLAP_ClickHouse.V01|——|ClickHouse.v01|数据类型|
一、数据类型
### --- 数据类型说明
~~~ 支持DML,
~~~ 为了提高性能,较传统数据库而言,clickhouse提供了复合数据类型。
~~~ ClickHouse的Upadate和Delete是由Alter变种实现。
二、整型
### --- 整形说明
~~~ 固定长度的整型,包括有符号整型或无符号整型。
~~~ 整型范围(-2n-1~2n-1-1):
Int8 | [-128 : 127] | 1 |
Int16 | - [-32768 : 32767] | 2 |
Int32 | [-2147483648 : 2147483647] | 3 |
Int64 | [-9223372036854775808 : 9223372036854775807] | 4 |
名称 | 范围 | 大小(字节) |
三、无符号整型范围(0~2n-1):
名称 | 范围 | 大小(字节) |
UInt8 | [0 : 255] | 1 |
UInt16[0 : 65535] | [0 : 65535] | 2 |
UInt32 | [0 : 4294967295] | 3 |
UInt64 | [0 : 18446744073709551615] | 4 |
四、浮点型
名称 | 大小(字节) | 有效精度(位数) | 传统 |
Float32 | 4 | 7 | Float |
Float64 | 8 | 16 | Double |
### --- 浮点型
~~~ 建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,
~~~ 如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。
hadoop01 :) select 1-0.9;
SELECT 1 - 0.9
┌───────minus(1, 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘
1 rows in set. Elapsed: 0.004 sec.
### --- 与标准SQL相比,ClickHouse 支持以下类别的浮点数:Inf-正无穷:
hadoop01 :) select 1/0;
SELECT 1 / 0
┌─divide(1, 0)─┐
│ inf │
└──────────────┘
### --- -Inf-负无穷:
hadoop01 :) select -1/0;
SELECT -1 / 0
┌─divide(-1, 0)─┐
│ -inf │
└───────────────┘
### --- NaN-非数字:
:) select 0/0
┌─divide(0, 0)─┐
│ nan │
└──────────────┘
五、Decimal
### --- Decimal
~~~ 如果要求更高精度,可以选择Decimal类型
~~~ 格式:Decimal(P,S)
~~~ P:代表精度,决定总位数(正数部分+小数部分),取值范围0-38
~~~ S:代表规模,决定小数位数,取值范围是0-P
~~~ # ClickHouse对Decimal提供三种简写:
~~~ Decimal32,Decimal64,Decimal128
### --- 相加、减精度取大
hadoop01 :) SELECT toDecimal32(2, 4) + toDecimal32(2, 2);
SELECT toDecimal32(2, 4) + toDecimal32(2, 2)
┌─plus(toDecimal32(2, 4), toDecimal32(2, 2))─┐
│ 4.0000 │
└────────────────────────────────────────────┘
hadoop01 :) SELECT toDecimal32(4, 4) - toDecimal32(2, 2);
SELECT toDecimal32(4, 4) - toDecimal32(2, 2)
┌─minus(toDecimal32(4, 4), toDecimal32(2, 2))─┐
│ 2.0000 │
└─────────────────────────────────────────────┘
### --- 相乘精度取和
hadoop01 :) SELECT toDecimal32(2, 2) * toDecimal32(4, 4);
SELECT toDecimal32(2, 2) * toDecimal32(4, 4)
┌─multiply(toDecimal32(2, 2), toDecimal32(4, 4))─┐
│ 8.000000 │
└────────────────────────────────────────────────┘
### --- 相除精度取被除数
hadoop01 :) SELECT toDecimal32(4, 4) / toDecimal32(2, 2);
SELECT toDecimal32(4, 4) / toDecimal32(2, 2)
┌─divide(toDecimal32(4, 4), toDecimal32(2, 2))─┐
│ 2.0000 │
└──────────────────────────────────────────────┘
六、字符串
### --- String
~~~ 字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
~~~ FixedString(N)
~~~ 固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,
~~~ 通过在字符串末尾添加空字节来达到 N 字节长度。
~~~ 当服务端读取长度大于 N 的字符串时候,将返回错误消息。
### --- SELECT
hadoop01 :) SELECT toFixedString('abc', 5), LENGTH(toFixedString('abc', 5)) AS LENGTH ;
SELECT
toFixedString('abc', 5),
LENGTH(toFixedString('abc', 5)) AS LENGTH
┌─toFixedString('abc', 5)─┬─LENGTH─┐
│ abc │ 5 │
└─────────────────────────┴────────┘
### --- UUID
~~~ ClickHouse将UUID这种在传统数据库中充当主键的类型直接做成了数据类型
hadoop01 :) CREATE TABLE UUID_TEST ( `c1` UUID, `c2` String ) ENGINE = Memory;
CREATE TABLE UUID_TEST
(
`c1` UUID,
`c2` String
)
ENGINE = Memory
### --- 插入数据:
hadoop01 :) insert into UUID_TEST select generateUUIDv4(),'t1';
INSERT INTO UUID_TEST SELECT
generateUUIDv4(),
't1'
Ok.
hadoop01 :) insert into UUID_TEST(c2) values('t2');
INSERT INTO UUID_TEST (c2) VALUES
Ok.
### --- 查询结果:
hadoop01 :) SELECT * FROM UUID_TEST ;
SELECT *
FROM UUID_TEST
┌───────────────────────────────────c1─┬─c2─┐
│ c57739fc-1367-45ab-b796-21b7b20fb82b │ t1 │
└──────────────────────────────────────┴────┘
┌───────────────────────────────────c1─┬─c2─┐
│ 00000000-0000-0000-0000-000000000000 │ t2 │
└──────────────────────────────────────┴────┘
七、枚举类型
### --- 枚举类型
~~~ 包括 Enum8 和 Enum16 类型。Enum 保存 'string'= integer 的对应关系。
~~~ Enum8 用 'String'= Int8 对描述。
~~~ Enum16 用 'String'= Int16 对描述。
### --- 用法演示:
~~~ 创建一个带有一个枚举 Enum8('hello' = 1, 'world' = 2) 类型的列:
hadoop01 :) CREATE TABLE t_enum ( x Enum8('hello' = 1, 'world' = 2) ) ENGINE = TinyLog;
CREATE TABLE t_enum
(
`x` Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog
### --- 这个 x 列只能存储类型定义中列出的值:'hello'或'world'。
~~~ 如果尝试保存任何其他值,ClickHouse 抛出异常。
hadoop01 :) INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello') ;
INSERT INTO t_enum VALUES
Ok.
hadoop01 :) INSERT INTO t_enum VALUES;
INSERT INTO t_enum VALUES
Ok.
hadoop01 :) insert into t_enum values('a') ;
INSERT INTO t_enum VALUES
Exception on client:
Code: 36. DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.5.4 revision 54435.
### --- 从表中查询数据时,ClickHouse 从 Enum 中输出字符串值。
hadoop01 :) SELECT * FROM t_enum;
SELECT *
FROM t_enum
┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘
### --- 如果需要看到对应行的数值,则必须将 Enum 值转换为整数类型。
~~~ # 为什么需要枚举类型?
~~~ 后续对枚举的操作:排序、分组、去重、过滤等,会使用Int类型的Value值
hadoop01 :) SELECT CAST(x, 'Int8') FROM t_enum;
SELECT CAST(x, 'Int8')
FROM t_enum
┌─CAST(x, 'Int8')─┐
│ 1 │
│ 2 │
│ 1 │
└─────────────────┘
八、数组
### --- 数组
~~~ Array(T):由 T 类型元素组成的数组。
~~~ T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。
~~~ 例如,不能在MergeTree 表中存储多维数组。
### --- 可以使用array函数来创建数组:
~~~ array(T)
~~~ 也可以使用方括号:ClickHouse能够自动推断数据类型
~~~ []
### --- 创建数组案例:
~~~ # 数组中可以有不同的数据类型,但是需要相互兼容。
hadoop01 :) SELECT array(1, 2.0) AS x, toTypeName(x);
SELECT
[1, 2.] AS x,
toTypeName(x)
┌─x─────┬─toTypeName(array(1, 2.))─┐
│ [1,2] │ Array(Float64) │
└───────┴──────────────────────────┘
hadoop01 :) SELECT [1, 2] AS x, toTypeName(x);
SELECT
[1, 2] AS x,
toTypeName(x)
┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8) │
└───────┴────────────────────┘
### --- 如果是声明表字段的时候,需要指明数据类型:
hadoop01 :) CREATE TABLE Array_test ( `c1` Array(String) ) ENGINE = memory;
CREATE TABLE Array_test
(
`c1` Array(String)
)
ENGINE = memory
九、元组
### --- 元组说明
~~~ Tuple(T1, T2, ...):元组,其中每个元素都有单独的类型。
### --- 创建元组的示例:
~~~ 在定义表字段的时候也需要指明数据类型
hadoop01 :) SELECT tuple(1,'a') AS x, toTypeName(x);
SELECT
(1, 'a') AS x,
toTypeName(x)
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String) │
└─────────┴───────────────────────────┘
十、Date、DateTime
### --- Date Time说明
~~~ 日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。
十一、布尔型
### --- 布尔型
~~~ 没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY