ByteHouse默认模式下,支持的数据类型和 ClickHouse 社区版比较类似,建议参考手册中的示例进行使用。文中的一些示例和内容参考了社区文档 行修改,来确保可以在 ByteHouse 中正常使用。
另外,ByteHouse 云数仓版在 2.0 版本开始,增加了对 MySQL 5.7 和 MySQL 8.0 常用功能及语法的兼容,可以实现与 MySQL 客户端应用程序和工具的无缝集成。本文也会对数据类型 MySQL 兼容性进行介绍。
分类 | 数据类型 |
---|---|
数值类型 |
|
字符串与二进制类型 |
|
日期与时间日期类型 |
|
半结构化数据类型 |
|
地理坐标类型 |
|
其他特殊数据类型 |
|
数据类型 | 备注 |
---|---|
| |
| ByteHouse当前支持最大精度限制为76,而不是1000 |
| 支持3-9位精度 |
| 有关详细信息,请参阅GIS功能介绍 |
数据类型 | 备注 |
---|---|
| MySQL模式下当前支持最大精度限制为76,而不是1000 |
| 在 ByteHouse 中是 String 类型的别名,无长度限制。 |
| 在 ByteHouse 中是 Fixedstring 类型的别名。 |
|
|
|
|
| 使用数字类型,并在内部转换为日期时间 datetime |
| 暂不支持 MySQL 模式下此数据类型 |
| 暂不支持 MySQL 模式下此数据类型 |
| 暂不支持 MySQL 模式下此数据类型 |
UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256
固定长度整数。
注意
创建表时,可以设置整数的数字参数(例如 TINYINT(8)、SMALLINT(16)、INT(32)、BIGINT(64)),但 ByteHouse 会自动忽略参数。
别名
Int8
— TINYINT
Int16
— SMALLINT
Int32
— INT
,INTEGER
.Int64
— BIGINT
.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
别名
Float32
— FLOAT
.Float64
— DOUBLE
.注意
创建表时,可以设置浮点数的数值参数(例如 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)
有符号定点数,可在加法、减法和乘法运算期间保持精度。 对于除法,最低有效数字将被丢弃(而非四舍五入)。
别名
Decimal
— DEC
参数
Decimal(P, S) 中 P 参数值的在以下范围时,等同于后者:
Decimal 数值范围
例如,Decimal32(4) 可以包含从 -99999.9999 到 99999.9999 的数字。
别名
String
— char
/ 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
— binary(N)
固定长度为 N 的字符串(N 为正自然数)。
您可以使用下面的语法对列声明为FixedString
类型:
<column_name> FixedString(N)
其中N是自然数。
当数据长度恰好为 N 个字节时,FixedString 类型非常高效。 在其他情况下,它可能会降低效率。
可以有效存储在FixedString
类型列中的值的示例:
FixedString(16)
)FixedString(16)
,SHA256使用FixedString(32)
)注意
如果要存储 UUID 值,请使用 UUID 数据类型。
向 ByteHouse 插入数据时:
Too Large value for FixString(N)
异常。数据查询时,ByteHouse 不会删除字符串末尾的空字节。 如果使用 WHERE
子句,则应手动添加空字节以匹配固定字符串值。
注意
CHAR
类型不同( MySQL 用空格填充,并且在输出时删除空格)。占两个字节,存储自 1970-01-01 以来的天数(无符号),上限为 2148 年。
存储值不带时区。
别名:
DateTime
— TIMESTAMP
用四个字节(无符号的)存储 Unix 时间戳。表示为日历日期和一天中的时间。精度为秒。
DateTime([timezone])
支持的值范围:[1970-01-01 00:00:00,2105-12-31 23:59:59]。
此类型允许以日期(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)。
示例
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 │ └─────────────────────────┴──────────┘
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
.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
类型的值转换过来
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') │ └─────────────────────────┴────────────────────────────────┘
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)是一个16字节的数字,用于标识记录。
UUID类型值的示例如下:
61f0c404-5cb3-11e7-907b-a6006ad3dba0
如果在插入新记录时未指定UUID列的值,则UUID值将用零填充:
00000000-0000-0000-0000-000000000000
允许用特殊标记 (NULL) 表示“缺失值”,可以与 TypeName
的正常值存放一起。例如,Nullable(Int8)
类型的列可以存储 Int8
类型值,而没有值的行将存储 NULL
。
对于 TypeName
,不能使用复合数据类型 阵列 和 元组。复合数据类型可以包含 Nullable
类型值,例如Array(Nullable(Int8))
。Nullable
类型字段不能包含在表索引中。
除非在 ClickHouse 服务器配置中另有说明,否则 NULL
是任何 Nullable
类型的默认值。