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 模式下此数据类型 |
固定长度整数。
注意
创建表时,可以设置整数的数字参数(例如 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
— FLOAT
.Float64
— DOUBLE
.注意
创建表时,可以设置浮点数的数值参数(例如 FLOAT(12)、FLOAT(15, 22)、DOUBLE(12)、DOUBLE(4, 18)),但 ByteHouse 会忽略它们。
有符号定点数,可在加法、减法和乘法运算期间保持精度。 对于除法,最低有效数字将被丢弃(而非四舍五入)。
别名
Decimal
— DEC
参数
Decimal(P, S) 中 P 参数值的在以下范围时,等同于后者:
Decimal 数值范围
例如,Decimal32(4) 可以包含从 -99999.9999 到 99999.9999 的数字。
任意长度的字符串。 长度不受限制。 该值可以包含任意字节集,包括空字节。
String 类型替代了其他数据库中的 VARCHAR、BLOB、CLOB 等类型。
注意
创建表时,可以设置字符串字段的数字参数(例如 VARCHAR(255)),但 ByteHouse 会忽略它们。
编码
ByteHouse 没有编码的概念。 字符串可以包含任意一组字节,这些字节按原样存储和输出。
如果您需要存储文本,我们建议使用UTF-8编码。 至少,如果您的终端使用 UTF-8(建议),您可以读取和写入您的值而无需进行转换。
同样,某些用于处理字符串的函数也有单独的变体,这些函数在假设字符串包含一组表示 UTF-8 编码文本的字节的情况下工作。
例如,“length”函数计算以字节为单位的字符串长度,而“lengthUTF8”函数以 Unicode 代码点计算字符串长度,假设该值是 UTF-8 编码的。
固定长度为 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]。
Array(T),由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。数组大小的上限为一百万个元素。
举例
您可以使用函数来创建数组:
array(T)
也可以使用方括号。
[]
Map(key, value)
可以存储 key:value
键值对类型的数据。
key
— 键值对的key,类型可以是:String, Integer, LowCardinality, 或者 FixedString.value
— 键值对的value,类型可以是:String, Integer, Array, LowCardinality, 或者 FixedString.使用 a['key']
可以从 a Map('key', 'value')
类型的列中获取到对应的值,这是一个线性复杂度的查询。
Tuple(T1,T2...)
Tuple(T1, T2, ...) 元组,其中每个元素都有单独的类型。
基本使用
您可以使用函数来创建元组:
tuple(T1, T2, ...)
创建元组的示例:
SELECT tuple(1,'a') AS x, toTypeName(x)
由命名值组成的枚举类型。
命名值必须声明为'string' = integer
对。 ByteHouse 仅存储数字,但支持通过名称对值进行操作。
ByteHouse 支持:
嵌套数据结构类似于嵌套表。嵌套数据结构的参数(列名和类型)与 CREATE 查询类似。每个表可以包含任意多行嵌套数据结构。
只支持一级嵌套。嵌套结构的列中,若列的类型是数组类型,那么该列其实和多维数组是相同的,所以目前嵌套层级的支持很局限(MergeTree 引擎中不支持存储这样的列)
大多数情况下,处理嵌套数据结构时,会指定一个单独的列。为了这样实现,列的名称会与点号连接起来。这些列构成了一组匹配类型。在同一条嵌套数据中,所有的列都具有相同的长度。
SELECT Goals.ID, Goals.Price FROM visits WHERE length(Goals.ID) < 5 LIMIT 10;
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
是与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)是一个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
类型的默认值。