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。