You need to enable JavaScript to run this app.
导航
基本数据类型
最近更新时间:2025.03.03 14:30:51首次发布时间: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

支持此数据类型。

Map

支持此数据类型。

JSON

支持此数据类型。

数值类型

整数类型

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