You need to enable JavaScript to run this app.
导航
基本数据类型
最近更新时间:2024.10.30 17:04:31首次发布时间: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, DateTime64, TIMESTAMP
  • Time

半结构化数据类型

  • 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 会忽略它们。

数值范围

  • Float32 :符合IEEE 754标准,单精度浮点数。
  • Float64:符合IEEE 754标准,双精度浮点数。

十进制类型

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

别名

  • Stringchar/ nchar/ character/varchar/text等,兼容 MySQL 语法。

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

注意

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

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

Fixedstring(N)

别名

  • Fixedstringbinary(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]。

DateTime64

此类型允许以日期(date)加时间(time)的形式来存储一个时刻的时间值,具有定义的亚秒精度
语法:

DateTime64(precision, [timezone])

在内部,此类型以Int64类型将数据存储为自Linux纪元开始(1970-01-01 00:00:00UTC)的时间刻度数(ticks)。时间刻度的分辨率由precision参数确定。此外,DateTime64 类型可以像存储其他数据列一样存储时区信息,时区会影响 DateTime64 类型的值如何以文本格式显示,以及如何解析以字符串形式指定的时间数据 (‘2020-01-01 05:00:01.000’)。时区不存储在表的行中(也不在resultset中),而是存储在列的元数据中。详细信息请参考 DateTime 数据类型.
值的范围: [1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999] (注意: 最大值的精度是8)。
示例

  1. 创建一个具有 DateTime64 类型列的表,并向其中插入数据:
CREATE TABLE dida.dt
(
    `timestamp` DateTime64(3, 'Asia/Istanbul'),
    `event_id` UInt8
)
ENGINE = CnchMergeTree()
order by event_id;

INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2);
SELECT * FROM dt;
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.000 │        1 │
│ 2019-01-01 00:00:00.000 │        2 │
└─────────────────────────┴──────────┘
  • 将日期时间作为integer类型插入时,它会被视为适当缩放的Unix时间戳(UTC)。1546300800000 (精度为3)表示 '2019-01-01 00:00:00' UTC. 不过,因为 timestamp 列指定了 Asia/Istanbul (UTC+3)的时区,当作为字符串输出时,它将显示为 '2019-01-01 03:00:00'
  • 当把字符串作为日期时间插入时,它会被赋予时区信息。 '2019-01-01 00:00:00' 将被认为处于 Asia/Istanbul 时区并被存储为 1546290000000.
  1. 过滤 DateTime64 类型的值
SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul')
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │        2 │
└─────────────────────────┴──────────┘

DateTime 不同, DateTime64 类型的值不会自动从 String 类型的值转换过来

  1. 获取 DateTime64 类型值的时区信息:
SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS x
┌──────────────────column─┬─x──────────────────────────────┐
│ 2019-10-16 04:12:04.000 │ DateTime64(3, 'Asia/Istanbul') │
└─────────────────────────┴────────────────────────────────┘
  1. 时区转换
SELECT
toDateTime64(timestamp, 3, 'Europe/London') as lon_time,
toDateTime64(timestamp, 3, 'Asia/Istanbul') as mos_time
FROM dt
┌───────────────lon_time──┬────────────────mos_time─┐
│ 2019-01-01 00:00:00.000 │ 2019-01-01 03:00:00.000 │
│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
└─────────────────────────┴─────────────────────────┘

其他类型

其他特殊数据类型。

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 类型的默认值。