ClickHouse 数据类型介绍



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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,802评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,062评论 25 707
  • 1.添加图片: 2.文字 3.按钮 4.屏幕分布
    冰西瓜大郎阅读 382评论 0 0
  • 雷雁雄8月1日总结:今天中午接待厂商领导,聊了很多现在市场存在的情况,也对下一步市场做了规划;下午和朋友去谈合作事...
    雷雁雄阅读 69评论 0 0
  • 肖佩云 一朵玫瑰十分美好 它站在河的对岸 绚丽又凋零 一杯咖啡热气腾腾 它隔着时光之河 真实又虚幻 一封情书情意绵...
    肖佩云阅读 559评论 0 3