美文网首页
ClickHouse数据类型

ClickHouse数据类型

作者: 这货不是王马勺 | 来源:发表于2023-03-19 10:42 被阅读0次

    数据类型

    1.整型

    固定长度的整型,包括有符号(正负)整型和无符号整型。
    整形范围:-2n-1~2n-1-1
    int8:(-128~127)
    int16:(-32768~32767)
    int32:(-2147483648~2147483647) 约21亿,类比其他数据库中的int
    int64:(-9223372036854775808~9223372036854775807) 约922亿亿?
    无符号整型范围:0~2n-1
    uint8:(0~255)
    uint16:(0~65535)
    uint32:(0~4294967295) 约42亿
    uint64:(0~18446744073709551615)

    2.浮点型

    float32:类比float
    float64:类比double
    建议尽量使用整数存储数据,例如将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。
    所以一般存钱这类的时候会使用decimal型。

    3.布尔型

    clickhouse没有布尔型,可以使用uint8,取值限制0或1。

    4.Decimal型

    有符号的浮点数,可在加减乘运算中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。
    有几种声明:
    Decimal32(s),相当于decimal(9-s,s),有效位数为1~9
    Decimal64(s),相当于decimal(18-s,s),有效位数为1~18
    Decimal128(s),相当于decimal(38-s,s),有效位数为1~38
    Decimal256(S)
    s标识小数位,如decimal32(5)表示整数+小数一共9位,小数部分有5位。
    使用场景一般数金额字段、汇率、利率等,为了保证小数点精度,防止精度丢失,会使用decimal。

    5.字符串

    string:任意长度字符串。可以包含任意的字节集,包含空字节。字符串类型可以代替其他 DBMSs 中的VARCHAR、BLOB、CLOB 等类型。
    FixedString(N):定长字符串。不够N字节则在字符串末尾添加空字节。
    定长很少使用,因为不方便。

    6.枚举类型

    枚举类型通常在定义常量时使用,ClickHouse提供了Enum8和Enum16两种枚举类型,分别转换位int8和int16存储。
    例:

    # 建表,其中x列只能存储类型定义中列出的值'hello'或'world'
    CREATE TABLE t_enum
    (
        x Enum8('hello' = 1, 'world' = 2)
    )
    ENGINE = TinyLog;
    # INSERT数据
    INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello');
    # 如果定义了枚举类型值之后,不能写入其他值的数据
    INSERT INTO t_enum values('a')
    # 报异常:Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)
    select cast(x,'Int8') from  t_enum;
    

    可以用于空间优化,如存很长的字符串,实际存的就是一个数字。但也会带来维护成本,增加复杂度,所以要谨慎使用。

    7.时间类型

    date:年月日,如'2020-02-20'
    日期用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。日期中没有存储时区信息。
    datetime:年月的时分秒,如'2020-02-20 20:02:20'
    用四个字节存储。
    datetime64:年月的时分秒亚秒,如'2020-02-20 20:02:20.66'

    8.数组类型

    Array(T),由 T 类型元素组成的数组,即同一个数组里面类型得一致。
    T 可以是任意类型,包含数组类型。但不推荐使用多维数组,ClickHouse对多维数组的支持很有限。例如,不能在MergeTree表中存储多维数组。
    例:

    #将1和2写死在数组x里,toTypeName()函数表示获取类型
    SELECT array(1, 2) AS x, toTypeName(x);
    # 结果输出
    ┌─x─────┬─toTypeName(array(1, 2))─┐
    │ [1,2] │ Array(UInt8)            │
    └───────┴─────────────────────────┘
    SELECT [1, 2] AS x, toTypeName(x);
    # 结果输出
    ┌─x─────┬─toTypeName([1, 2])─┐
    │ [1,2] │ Array(UInt8)       │
    └───────┴────────────────────┘
    

    9.Nullable

    牢记:使用Nullable几乎总是对性能产生负面影响。
    Nullable类型表示某个基础数据类型可以是Null值。其具体用法如下所示:

    -- 建表
    CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
    -- 写入数据
    INSERT INTO t_null VALUES (1, NULL), (2, 3);
    SELECT x + y FROM t_null;
    -- 结果
    ┌─plus(x, y)─┐
    │       ᴺᵁᴸᴸ │
    │          5 │
    └────────────┘
    

    可以用没有意义的数字,或空字符串来替换。

    10.其他数据类型

    UUID
    UUID是一种数据库常见的主键类型,在ClickHouse中直接把它作为一种数据类型。UUID共有32位,它的格式为8-4-4-4-12,比如:
    61f0c404-5cb3-11e7-907b-a6006ad3dba0
    当不指定uuid列的值时,填充为0:
    00000000-0000-0000-0000-000000000000
    使用示例如下:

    -- 建表
    CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog;
    -- insert数据
    INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1';
    INSERT INTO t_uuid (y) VALUES ('Example 2');
    SELECT * FROM t_uuid;
    -- 结果输出,默认被填充为0
    ┌────────────────────────────────────x─┬─y─────────┐
    │ b6b019b5-ee5c-4967-9c4d-8ff95d332230 │ Example 1 │
    │ 00000000-0000-0000-0000-000000000000 │ Example 2 │
    └──────────────────────────────────────┴───────────┘
    

    Tuple类型
    Tuple(T1, T2, …),元组,与Array不同的是,Tuple中每个元素都有单独的类型,不能在表中存储元组(除了内存表)。它们可以用于临时列分组。在查询中,IN表达式和带特定参数的 lambda 函数可以来对临时列进行分组。

    SELECT tuple(1,'a') AS x, toTypeName(x);
    --结果输出
    ┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
    │ (1,'a') │ Tuple(UInt8, String)      │
    └─────────┴───────────────────────────┘
    -- 建表
    CREATE TABLE t_tuple(
       c1 Tuple(String,Int8)
    ) engine=TinyLog;
    -- INSERT数据
    INSERT INTO t_tuple VALUES(('jack',20));
    --查询数据
    SELECT * FROM t_tuple;
    ┌─c1──────────┐
    │ ('jack',20) │
    └─────────────┘
    -- 如果插入数据类型不匹配,会报异常
    INSERT INTO t_tuple VALUES(('tom','20'));
    -- Type mismatch in IN or VALUES section. Expected: Int8. Got: String
    

    Domain类型
    Domain类型是特定实现的类型:
    IPv4是与UInt32类型保持二进制兼容的Domain类型,用于存储IPv4地址的值。它提供了更为紧凑的二进制存储的同时支持识别可读性更加友好的输入输出格式。
    IPv6是与FixedString(16)类型保持二进制兼容的Domain类型,用于存储IPv6地址的值。它提供了更为紧凑的二进制存储的同时支持识别可读性更加友好的输入输出格式。
    注意低版本的ClickHouse不支持此类型。

    -- 建表
    CREATE TABLE hits
    (url String, 
     from IPv4
    ) ENGINE = MergeTree()
    ORDER BY from;
    -- 写入数据
    INSERT INTO hits (url, from) VALUES
    ('https://wikipedia.org', '116.253.40.133')
    ('https://clickhouse.tech', '183.247.232.58');
    
    -- 查询
    SELECT * FROM hits;
    ┌─url─────────────────────┬───────────from─┐
    │ https://wikipedia.org   │ 116.253.40.133 │
    │ https://clickhouse.tech │ 183.247.232.58 │
    └─────────────────────────┴────────────────┘
    

    相关文章

      网友评论

          本文标题:ClickHouse数据类型

          本文链接:https://www.haomeiwen.com/subject/oaoerdtx.html