ClickHouse 数据类型介绍
发布于 2 个月前 作者 theseusyang 144 次浏览 来自 文档翻译

UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64

固定长度的整数,带或不带标志。

Float32, Float64 浮点数就像C语言中的“float”和“double”一样。与标准SQL相比,浮点数支持“inf”,“-inf”,甚至是“nan”。请参阅“ORDER BY子句”中有关排序nans的注释。我们不建议在表格中存储浮点数。

字符串 任意长度的字符串。长度不限。该值可以包含任意字节集,包括空字节。String类型替换了其他DBMS类型的VARCHAR,BLOB,CLOB和其他类型。

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

FixedString(N) 一个固定长度的N个字节的字符串(不是字符或代码点)。N必须是严格正数的自然数。当服务器读取包含较少字节的字符串(例如,作为在INSERT查询中传递的输入)时,通过在右侧附加空字节,字符串被填充为N个字节。当服务器读取包含更多字节的字符串时,将返回错误消息。当服务器写入一个字符串(例如,作为SELECT查询的输出)时,空字节不会从字符串末尾删除,而是输出。请注意,这种行为不同于CHAR类型的MySQL行为(其中字符串用空格填充,并且空格被移除以用于输出)。

Date 一个Date。以1970-01-01(无符号)以来的天数存储在两个字节中。允许在Unix Epoch刚刚开始之后将值存储到编译阶段(目前,日期到2038年,但可能扩展到2106)由常量定义的上限。最小值输出为0000-00-00。

日期存储没有时区。

DateTime 日期与时间。以四个字节存储为Unix时间戳(无符号)。允许将值存储在与日期类型相同的范围内。最小值输出为0000-00-00 00:00:00。时间储存精度高达1秒(不闰秒)。

时区 带时间的日期是从客户端或服务器启动时使用系统的时区,从文本(分为组成部分)转换为二进制和返回。在文本格式中,关于夏令时的信息丢失。

只支持那些时间从未与世界标准时间(UTC)有所不同的时区,在您要使用的整个时间范围内保持部分小时数(无闰秒)。

因此,在处理文本日期时(例如,保存文本转储时),请记住夏令时更改时可能会有歧义,如果时区更改,则可能会出现匹配数据的问题。

枚举 Enum8或Enum16。存储为Int8或Int16的一组枚举字符串值。例:

Enum8(‘hello’= 1,‘world’= 2)

  • 这个数据类型有两个值 - ‘hello’和’world’。

该数值必须在-128…127为Enum8和-32768…32767为Enum16。枚举的每个成员也必须有不同的数字。空字符串是一个有效的值。数字不需要是连续的,可以以任何顺序。是顺序无关的。

在内存中,数据的存储方式与数字类型Int8和Int16相同。以文本格式读取时,读取字符串并查找相应的数值。如果找不到,则会抛出异常。当以文本格式写入时,查找存储的数字并写出相应的字符串。如果数字不对应已知的值,则会抛出异常。以二进制格式,信息以与Int8和Int16相同的方式保存。Enum的隐式默认值是具有最小数值的值。

在ORDER BY,GROUP BY,IN,DISTINCT等中,枚举的行为与数值类似。例如,它们将按照ORDER BY中的数值进行排序。Equal和Compare运算符的行为就像他们运行在数值上一样,无感知。

枚举值不能与数字进行比较,它们必须与字符串进行比较。如果字符串比较不是Enum的有效值,则会抛出异常。该IN操作符支持与枚举的左侧和一组在右侧的字符串。

大多数数字和字符串操作没有为Enum值定义,例如,将一个数字添加到Enum或将一个字符串连接到一个Enum。但是,可以使用toString函数将Enum转换为其字符串值。枚举值也可以使用toT函数转换为数字类型,其中T是数字类型。当T对应于枚举的基础数值类型时,此转换为零成本。

可以使用ALTER将新成员添加到Enum。如果唯一的变化是对数值的设定,那么操作几乎是即时的。也可以使用ALTER删除Enum的成员。删除成员只有在表中从未使用删除的值时才是安全的。作为一种安全措施,更改先前定义的Enum成员的数值将引发异常。

使用ALTER,它是可以改变的Enum8到Enum16反之亦然-就像改变INT8到Int16的。

Array(T) T 类型的数组。T型可以是任何类型,包括数组。我们不推荐使用多维数组,因为它们不被很好的支持(例如,除了内存表之外,你不能在多维数组中存储多维数组)。

元组(T1,T2,…) 元组不能写入表(除了内存表)。它们用于临时列分组。在查询中使用IN表达式时,可以对列进行分组,并指定lambda函数的某些形式参数。有关更多信息,请参阅“IN运算符”和“高阶函数”。

元组可以作为运行查询的结果输出。在这种情况下,对于JSON *以外的文本格式,括号中的值用逗号分隔。在JSON *格式中,元组输出为数组(在方括号中)。

嵌套的数据结构 嵌套(Name1 Type1,Name2 Type2,…)

嵌套的数据结构就像一个嵌套的表。嵌套数据结构的参数 - 列名和类型 - 与在CREATE查询中的指定方式相同。每个表的行可以对应于嵌套数据结构中的任意数量的行。

例如:

CREATE TABLE test.visits

(

CounterID UInt32,

StartDate Date,

Sign Int8,

IsNew UInt8,

VisitID UInt64,

UserID UInt64,

Goals Nested

(

ID UInt32,

Serial UInt32,

EventTime DateTime,

Price Int64,

OrderID String,

CurrencyID UInt32

),

) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)

此示例声明了“目标”嵌套数据结构,其中包含有关转换的数据(达到的目标)。“访问”表中的每一行可以对应于零或任意数量的转换。

只支持一个嵌套级别。

在大多数情况下,使用嵌套数据结构时,会指定其各个列。为此,列名用点分隔。这些列组成一个匹配类型的数组。单个嵌套数据结构的所有列数组具有相同的长度。

例如:

SELECT

Goals.ID,

Goals.EventTime

FROM test.visits

WHERE CounterID = 101500 AND length(Goals.ID) < 5

LIMIT 10

┌─Goals.ID───────────────────────┬─Goals.EventTime──────────────────────────────────┐

│ [1073752,591325,591325] │ [‘2014-03-17 16:38:10’,‘2014-03-17 16:38:48’,‘2014-03-17 16:42:27’] │

│ [1073752] │ [‘2014-03-17 00:28:25’] │

│ [1073752] │ [‘2014-03-17 10:46:20’] │

│ [1073752,591325,591325,591325] │ [‘2014-03-17 13:59:20’,‘2014-03-17 22:17:55’,‘2014-03-17 22:18:07’,‘2014-03-17 22:18:51’] │

│ [] │ [] │

│ [1073752,591325,591325] │ [‘2014-03-17 11:37:06’,‘2014-03-17 14:07:47’,‘2014-03-17 14:36:21’] │

│ [] │ [] │

│ [] │ [] │

│ [591325,1073752] │ [‘2014-03-17 00:46:05’,‘2014-03-17 00:46:05’] │

│ [1073752,591325,591325,591325] │ [‘2014-03-17 13:28:33’,‘2014-03-17 13:30:26’,‘2014-03-17 18:51:21’,‘2014-03-17 18:51:45’] │

└────────────────────────────────┴───────────────────────────────────────────┘

将嵌套数据结构视为一组长度相同的多列数组是最容易的。

SELECT查询可以指定整个嵌套数据结构的名称而不是单个列的唯一位置是ARRAY JOIN子句。有关更多信息,请参见“ARRAY JOIN子句”。例如:

SELECT

Goal.ID,

Goal.EventTime

FROM test.visits

ARRAY JOIN Goals AS Goal

WHERE CounterID = 101500 AND length(Goals.ID) < 5

LIMIT 10

┌─Goal.ID─┬──────Goal.EventTime─┐

│ 1073752 │ 2014-03-17 16:38:10 │

│ 591325 │ 2014-03-17 16:38:48 │

│ 591325 │ 2014-03-17 16:42:27 │

│ 1073752 │ 2014-03-17 00:28:25 │

│ 1073752 │ 2014-03-17 10:46:20 │

│ 1073752 │ 2014-03-17 13:59:20 │

│ 591325 │ 2014-03-17 22:17:55 │

│ 591325 │ 2014-03-17 22:18:07 │

│ 591325 │ 2014-03-17 22:18:51 │

│ 1073752 │ 2014-03-17 11:37:06 │

└─────────┴─────────────────────┘

您不能对整个嵌套数据结构执行SELECT。您只能明确列出属于其中的单个列。

对于INSERT查询,应该单独传递嵌套数据结构的所有组件列数组(就像它们是单独的列数组一样)。在插入期间,系统检查它们具有相同的长度。

对于DESCRIBE查询,嵌套数据结构中的列以相同的方式单独列出。

对于嵌套数据结构中的元素,ALTER查询非常有限。

AggregateFunction(name,types_of_arguments …) 集合函数的中间状态。要得到它,使用具有“-State”后缀的聚合函数。有关更多信息,请参阅“AggregatingMergeTree”。

特殊的数据类型 特殊数据类型值不能保存到表中或输出到结果中,而是用作运行查询的中间结果。

集合 用于IN表达式的右半部分。

表达式 用于表示高阶函数中的lambda表达式。

布尔值 布尔值没有单独的类型。他们使用UInt8类型,限制为值0或1。

回到顶部