You need to enable JavaScript to run this app.
导航

数据类型

最近更新时间2024.01.19 10:49:10

首次发布时间2021.10.22 10:06:12

ByteHouse默认模式下,支持的数据类型和 ClickHouse 社区版比较类似,建议参考手册中的示例进行使用。文中的一些示例和内容参考了社区文档 行修改,来确保可以在 ByteHouse 中正常使用。
另外,ByteHouse 云数仓版在 2.0 版本开始,增加了对 MySQL 5.7 和 MySQL 8.0 常用功能及语法的兼容,可以实现与 MySQL 客户端应用程序和工具的无缝集成。本文也会对数据类型 MySQL 兼容性进行介绍。

数据类型概述

默认模式(ClickHouse)下支持的数据类型

分类

数据类型

数值类型

  • Int8 (TINYINT), Int16(SMALLINT),Int32(INT, INTEGER), Int64(BIGINT), Int128, Int256, UInt8, UInt16, UInt32, UInt64, UInt128, Uint256
  • Float32(FLOAT) Float64(DOUBLE)
  • Decimal(DEC), Decimal32, Decimal64, Decimal128, Decimal256

字符串与二进制类型

  • String, TEXT, TINYTEXT, MEDIUMTEXT, LONGTEXT, BLOB, TINYBLOB, MEDIUMBLOB , LONGBLOB, CHAR, VARCHAR
  • FixedString, BINARY

日期与时间日期类型

  • Date, Date32
  • DateTime, TIMESTAMP

半结构化数据类型

  • Array
  • Map
  • Tuple
  • Enum8 Enum16
  • Nested

地理坐标类型

  • Point
  • Ring
  • Polygon
  • MultiPolygon

其他特殊数据类型

  • IPv4 IPv6
  • Nullable
  • UUID

兼容 MySQL 的新增数据类型

数据类型

备注

BOOLEAN/ BOOL

NUMERIC/
DECIMAL(M ,D)

ByteHouse当前支持最大精度限制为76,而不是1000

TIME

支持3-9位精度

Point

有关详细信息,请参阅GIS功能介绍

其他 MySQL 数据类型兼容性差异

数据类型

备注

DECIMAL(M ,D)

MySQL模式下当前支持最大精度限制为76,而不是1000

VARCHAR

在 ByteHouse 中是 String 类型的别名,无长度限制。
在 MySQL 中其长度限制为 0-65535 bytes。

BINARY

在 ByteHouse 中是 Fixedstring 类型的别名。

DATE

  1. Date16 范围为 1970 - 2149
  2. Date32 范围为 1900-2299

DATETIME

  1. ByteHouse分为数据类型Datetime和Datetime64。Datetime不支持数字,Datetime64支持0-9位。
  2. Datetime占用4个字节,Datetime64占用8个字节。
  3. 建议使用Datetime64的行为来实现MySQL的相同行为。
  4. DateTime/DateTime64将时间存储为unix时间戳。
  5. 该值本身与时区无关。在二进制格式中,它表示为unix时间戳。
  6. 在text文本格式中,它被序列化为YYYY-MM-DD hh:MM:ss格式并从中解析。文本格式取决于时区。
  7. DateTime/DateTime64范围与Date/Date32相同。

TIMESTAMP

使用数字类型,并在内部转换为日期时间 datetime

Array

暂不支持 MySQL 模式下此数据类型

Map

暂不支持 MySQL 模式下此数据类型

JSON

暂不支持 MySQL 模式下此数据类型

数值类型

UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256

固定长度整数。

注意

创建表时,可以设置整数的数字参数(例如 TINYINT(8)、SMALLINT(16)、INT(32)、BIGINT(64)),但 ByteHouse 会自动忽略参数。

别名

  • Int8TINYINT
  • Int16SMALLINT
  • Int32INT,INTEGER.
  • Int64BIGINT.

Int 数值范围

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

UInt 数值范围

  • UInt8 — [0 : 255]
  • UInt16 — [0 : 65535]
  • UInt32 — [0 : 4294967295]
  • UInt64 — [0 : 18446744073709551615]
  • UInt256 — [0 : 115792089237316195423570985008687907853269984665640564039457584007913129639935]

Float32, Float64

别名

  • Float32FLOAT.
  • Float64DOUBLE.

注意

创建表时,可以设置浮点数的数值参数(例如 FLOAT(12)、FLOAT(15, 22)、DOUBLE(12)、DOUBLE(4, 18)),但 ByteHouse 会忽略它们。

Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S)

有符号定点数,可在加法、减法和乘法运算期间保持精度。 对于除法,最低有效数字将被丢弃(而非四舍五入)。
别名

  • DecimalDEC

参数

  • P - precision,精度,范围为 [ 1 : 76 ],表示数字中的有效位(包括小数)。
  • S - scale, 规模,范围为 [ 0 : P ],表示小数点右边的位数。

Decimal(P, S) 中 P 参数值的在以下范围时,等同于后者:

  • P 在 [ 1 : 9 ],等同于 Decimal32(S)
  • P 在 [ 10 : 18 ],等同于 Decimal64(S)
  • P 在 [ 19 : 38 ],等同于 Decimal128(S)

Decimal 数值范围

  • 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) )

例如,Decimal32(4) 可以包含从 -99999.9999 到 99999.9999 的数字。

字符串与二进制类型

String

任意长度的字符串。 长度不受限制。 该值可以包含任意字节集,包括空字节。
String 类型替代了其他数据库中的 VARCHAR、BLOB、CLOB 等类型。

注意

创建表时,可以设置字符串字段的数字参数(例如 VARCHAR(255)),但 ByteHouse 会忽略它们。

编码
ByteHouse 没有编码的概念。 字符串可以包含任意一组字节,这些字节按原样存储和输出。
如果您需要存储文本,我们建议使用UTF-8编码。 至少,如果您的终端使用 UTF-8(建议),您可以读取和写入您的值而无需进行转换。
同样,某些用于处理字符串的函数也有单独的变体,这些函数在假设字符串包含一组表示 UTF-8 编码文本的字节的情况下工作。
例如,“length”函数计算以字节为单位的字符串长度,而“lengthUTF8”函数以 Unicode 代码点计算字符串长度,假设该值是 UTF-8 编码的。

Fixedstring(N)

固定长度为 N 的字符串(N 为正自然数)。
您可以使用下面的语法对列声明为FixedString类型:

<column_name> FixedString(N)

其中N是自然数。
当数据长度恰好为 N 个字节时,FixedString 类型非常高效。 在其他情况下,它可能会降低效率。
可以有效存储在FixedString类型列中的值的示例:

  • 二进制表示的IP地址(IPv6使用FixedString(16)
  • 语言代码(ru_RU, en_US … )
  • 货币代码(USD, RUB … )
  • 二进制表示的哈希值(MD5使用FixedString(16),SHA256使用FixedString(32)

注意

如果要存储 UUID 值,请使用 UUID 数据类型。

向 ByteHouse 插入数据时:

  • 如果字符串包含的字节数少于 N,则用空字节补足该字符串。
  • 如果字符串包含的字节数超过 N 个字节,则引发 Too Large value for FixString(N) 异常。

数据查询时,ByteHouse 不会删除字符串末尾的空字节。 如果使用 WHERE 子句,则应手动添加空字节以匹配固定字符串值。

注意

  1. 这种方式与 MySQL 的 CHAR 类型不同( MySQL 用空格填充,并且在输出时删除空格)。
  2. FixedString(N) 值的长度是常量。 即使 FixedString(N) 值仅填充空字节, length 函数也会返回 N,但在这种情况下,empty 函数会返回 1。

日期与时间日期类型

Date

占两个字节,存储自 1970-01-01 以来的天数(无符号),上限为 2148 年。
存储值不带时区。

DateTime

别名:

  • DateTimeTIMESTAMP

用四个字节(无符号的)存储 Unix 时间戳。表示为日历日期和一天中的时间。精度为秒。

DateTime([timezone])

支持的值范围:[1970-01-01 00:00:00,2105-12-31 23:59:59]。

半结构化数据类型

Array(T)

Array(T),由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。数组大小的上限为一百万个元素。
举例
您可以使用函数来创建数组:

array(T)

也可以使用方括号。

[]

Map(key, value)

Map(key, value) 可以存储 key:value 键值对类型的数据。

使用 a['key'] 可以从 a Map('key', 'value') 类型的列中获取到对应的值,这是一个线性复杂度的查询。
Tuple(T1,T2...)
Tuple(T1, T2, ...) 元组,其中每个元素都有单独的类型。
基本使用
您可以使用函数来创建元组:

tuple(T1, T2, ...)

创建元组的示例:

SELECT tuple(1,'a') AS x, toTypeName(x)

Enum8, Enum 16

由命名值组成的枚举类型。
命名值必须声明为'string' = integer 对。 ByteHouse 仅存储数字,但支持通过名称对值进行操作。
ByteHouse 支持:

  • Enum8:8 位枚举。 它最多可以包含 [-128, 127] 范围内枚举的 256 个值。
  • Enum16:16 位枚举。 它最多可以包含 [-32768, 32767] 范围内枚举的 65536 个值。

Nested(n1 T1, n2 T2, …)

嵌套数据结构类似于嵌套表。嵌套数据结构的参数(列名和类型)与 CREATE 查询类似。每个表可以包含任意多行嵌套数据结构。
只支持一级嵌套。嵌套结构的列中,若列的类型是数组类型,那么该列其实和多维数组是相同的,所以目前嵌套层级的支持很局限(MergeTree 引擎中不支持存储这样的列)
大多数情况下,处理嵌套数据结构时,会指定一个单独的列。为了这样实现,列的名称会与点号连接起来。这些列构成了一组匹配类型。在同一条嵌套数据中,所有的列都具有相同的长度。

SELECT Goals.ID, Goals.Price FROM visits WHERE length(Goals.ID) < 5 LIMIT 10;

其他特殊数据类型

IPv4

IPv4是与UInt32类型保持二进制兼容的Domain类型,其用于存储IPv4地址的值。它提供了更为紧凑的二进制存储的同时支持识别可读性更加友好的输入输出格式。
基本使用
在写入与查询时,IPv4类型能够识别可读性更加友好的输入输出格式:

INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '116.253.40.133')('https://clickhouse.tech', '183.247.232.58')('https://clickhouse.tech/docs/en/', '116.106.34.242');

SELECT * FROM hits;

IPv6

IPv6是与FixedString(16)类型保持二进制兼容的Domain类型,其用于存储IPv6地址的值。它提供了更为紧凑的二进制存储的同时支持识别可读性更加友好的输入输出格式。
基本使用
在写入与查询时,IPv6类型能够识别可读性更加友好的输入输出格式:

INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '2a02:aa08:e000:3100::2')('https://clickhouse.tech', '2001:44c8:129:2632:33:0:252:2')('https://clickhouse.tech/docs/en/', '2a02:e980:1e::1');

SELECT * FROM hits;

UUID

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

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

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

00000000-0000-0000-0000-000000000000

Nullable(T)

允许用特殊标记 (NULL) 表示“缺失值”,可以与 TypeName 的正常值存放一起。例如,Nullable(Int8) 类型的列可以存储 Int8 类型值,而没有值的行将存储 NULL
对于 TypeName,不能使用复合数据类型 阵列元组。复合数据类型可以包含 Nullable 类型值,例如Array(Nullable(Int8))
Nullable 类型字段不能包含在表索引中。
除非在 ClickHouse 服务器配置中另有说明,否则 NULL 是任何 Nullable 类型的默认值。