整型

固定长度的整型,包括有符号整型或无符号整型。
创建表时,可以为整数设置类型参数 (例如. TINYINT(8), SMALLINT(16), INT(32), BIGINT(64)), 但 ClickHouse 会忽略它们.

整型范围

  • Int8 — [-128 : 127]
  • Int16 — [-32768 : 32767]
  • Int32 — [-2147483648 : 2147483647]
  • Int64 — [-9223372036854775808 : 9223372036854775807]
  • Int128 — [-170141183460469231731687303715884105728 : 170141183460469231731687303715884105727]
  • Int256 — [-57896044618658097711785492504343953926634992332820282019728792003956564819968 : 57896044618658097711785492504343953926634992332820282019728792003956564819967]

别名:

  • Int8TINYINT, BOOL, BOOLEAN, INT1.
  • Int16SMALLINT, INT2.
  • Int32INT, INT4, INTEGER.
  • Int64BIGINT.

    无符号整型范围

  • UInt8 — [0 : 255]

  • UInt16 — [0 : 65535]
  • UInt32 — [0 : 4294967295]
  • UInt64 — [0 : 18446744073709551615]
  • UInt128 — [0 : 340282366920938463463374607431768211455]
  • UInt256 — [0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935]

    浮点型

    Float32 - float
    Float64 – double
    建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,例如货币数量或页面加载时间用毫秒为单位表示
    对浮点数进行计算可能引起四舍五入的误差 ```scala cdh1 :) SELECT 1 - 0.9

SELECT 1 - 0.9

┌───────minus(1, 0.9)─┐ │ 0.09999999999999998 │ └─────────────────────┘

  1. 使用场景:一般数据值比较小,不涉及大量的统计计算,精度要求不高的时候。比如保存商品的重量。
  2. <a name="ViFsD"></a>
  3. # NaN and Inf
  4. - **Inf** 正无穷
  5. ```scala
  6. SELECT 0.5 / 0
  7. ┌─divide(0.5, 0)─┐
  8. │ inf │
  9. └────────────────┘
  • -Inf – 负无穷

    1. SELECT -0.5 / 0
    2. ┌─divide(-0.5, 0)─┐
    3. -inf
    4. └─────────────────┘
  • NaN – 非数字

    1. SELECT 0 / 0
    2. ┌─divide(0, 0)─┐
    3. nan
    4. └──────────────┘

    布尔型

    https://github.com/ClickHouse/ClickHouse/commit/4076ae77b46794e73594a9f400200088ed1e7a6e 之后,有单独的类型来存储布尔值。
    在此之前的版本,没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。

    Decimal

    有符号的定点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。
    参数:

  • P - 精度。有效范围:[1:38],决定可以有多少个十进制数字(包括分数)。

  • S - 规模。有效范围:[0:P],决定数字的小数部分中包含的小数位数。

格式:

  • Decimal32(s),相当于 Decimal(9-s,s),有效位数为 1~9
  • Decimal64(s),相当于 Decimal(18-s,s),有效位数为 1~18
  • Decimal128(s),相当于 Decimal(38-s,s),有效位数为 1~38

    字符串

    String

    字符串可以任意长度的。它可以包含任意的字节集,包含空字节。因此,字符串类型可以代替其他 DBMSs 中的 VARCHAR、BLOB、CLOB 等类型。

    FixedString(N)

    固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。与 String 相比,极少会使用 FixedString,因为使用起来不是很方便。

    枚举

    包括 Enum8 和 Enum16 类型。Enum 保存 ‘string’= integer 的对应关系。在 ClickHouse 中,尽管用户使用的是字符串常量,但所有含有 Enum 数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String 数据类型更有效。

  • Enum8‘String’= Int8 对描述。

  • Enum16‘String’= Int16 对描述。

用法:
创建一个带有一个枚举 Enum8(‘hello’ = 1, ‘world’ = 2) 类型的列:

  1. CREATE TABLE t_enum
  2. (
  3. x Enum8('hello' = 1, 'world' = 2)
  4. )
  5. ENGINE = TinyLog

这个 x 列只能存储类型定义中列出的值:‘hello’‘world’。如果您尝试保存任何其他值,ClickHouse 抛出异常。

  1. INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
  2. Ok.
  3. 3 rows in set. Elapsed: 0.002 sec.
  1. INSERT INTO t_enum VALUES('a')
  2. Exception on client:
  3. Code: 49. DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'world' = 2)

当您从表中查询数据时,ClickHouse 从 Enum 中输出字符串值。

  1. SELECT * FROM t_enum
  2. ┌─x─────┐
  3. hello
  4. world
  5. hello
  6. └───────┘

如果需要看到对应行的数值,则必须将 Enum 值转换为整数类型。

  1. SELECT CAST(x, 'Int8') FROM t_enum
  2. ┌─CAST(x, 'Int8')─┐
  3. 1
  4. 2
  5. 1
  6. └─────────────────┘

时间类型

目前 ClickHouse 有三种时间类型

  • Date 接受年-月-日的字符串比如 ‘2019-12-16’
  • Datetime 接受年-月-日 时:分:秒的字符串比如 ‘2019-12-16 20:50:10’
  • Datetime64 接受年-月-日 时:分:秒.亚秒的字符串比如‘2019-12-16 20:50:10.66’

日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。

数组

T 类型元素组成的数组。
T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能存储在 MergeTree 表中存储多维数组。

  • 可以使用array函数来创建数组

    1. SELECT array(1, 2) AS x, toTypeName(x)
  • 可以使用方括号来创建数组

    1. SELECT [1, 2] AS x, toTypeName(x)

    UUID

    通用唯一标识符(UUID)是一个16字节的数字,用于标识记录。
    UUID类型值的示例如下:

    1. 61f0c404-5cb3-11e7-907b-a6006ad3dba0

    如果在插入新记录时未指定UUID列的值,则UUID值将用零填充:

    1. 00000000-0000-0000-0000-000000000000

    要生成UUID值,ClickHouse提供了 generateuidv4 函数。