数据类型 一、整型 二、 浮点型 三、Decimal 四、布尔型 五、字符串 六、枚举类型 七、时间类型 八、数组 九、其他数据类型 十、默认值
一、整型
固定长度的整型有两种: 使用场景: 个数、数量、也可以存储型 id。
符号整型
数据类型 取值范围 Int8 -128 ~ 127 Int16 -32768 ~ 32767 Int32 -2147483648 ~ 2147483647 Int64 -9223372036854775808 ~ 223372036854775807
无符号整型
数据类型 取值范围 Int8 0 ~ 255 Int16 0 ~ 65535 Int32 0 ~ 4294967295 Int64 0 ~ 18446744073709551615
二、 浮点型
ClickHouse支持Float32和Float64两种浮点类型 建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。
-- 取值范围
select 1 -0.9 --的结果是0.09999999999999998
select 1 /0 --的结果是 inf(正无穷)
select -1/0 --的结果是 -inf(负无穷)
select 0 /0 --的结果是 nan(非数字)
三、Decimal
有符号的浮点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会 被丢弃(不舍入)。 使用场景: 一般金额字段、汇率、利率等字段为了保证小数点精度,都使用 Decimal 进行存储。 数据采用与自身位宽相同的有符号整数存储。这个数在内存中实际范围会高于上述范围,从 String 转换到十进制数的时候会做对应的检查。由于现代CPU不支持128位数字,因此 Decimal128 上的操作由软件模拟。 所以 Decimal128 的运算速度明显慢于 Decimal32/Decimal64。 Decimal(P,S),P参数指的是精度,有效范围:[1:38],决定可以有多少个十进制数字(包括分数);S参数指的是小数长度,有效范围:[0:P],决定数字的小数部分中包含的小数位数。
数据类型 十进制的范围 Decimal32(S) Decimal32(S): ( -1 * 10^(9 - S), 1 * 10^(9 - S) ) Decimal64(S) Decimal64(S): ( -1 * 10^(18 - S), 1 * 10^(18 - S) ) Decimal128(S) Decimal128(S): ( -1 * 10^(38 - S), 1 * 10^(38 - S) )
四、布尔型
ClickHouse中没有定义布尔类型,可以使用UInt8类型,取值限制为0或1。
五、字符串
ClickHouse中的String类型没有编码的概念。字符串可以是任意的字节集,按它们原本的方式进行存储和输出。若需存储文本,建议使用UTF-8编码。至少,如果你的终端使用UTF-8,这样读写就不需要进行任何的转换。对不同的编码文本ClickHouse会有不同处理字符串的函数。比如,length函数可以计算字符串包含的字节数组的长度,然而lengthUTF8函数是假设字符串以 UTF-8编码,计算的是字符串包含的Unicode字符的长度。 使用场景:名称、文字描述、字符型编码。 固定长度的可以保存一些定长的内容,比 如一些编码,性别等但是考虑到一定的变化风险,带来收益不够明显,所以定长字符串使用 意义有限。 与 String 相比,极少会使用 FixedString,因为使用起来不是很方便。
数据类型 十进制的范围 String 字符串可以任意长度的。它可以包含任意的字节集,包含空字节。ClickHouse中的String类型可以代替其他DBMS中的VARCHAR、BLOB、CLOB等类型。 FixedString(N) 固定长度 N 的字符串,N必须是严格的正自然数。当服务端读取长度小于N的字符串时候,通过在字符串末尾添加空字节来达到N字节长度。当服务端读取长度大于N的字符串时候,将返回错误消息。与String相比,极少会使用FixedString,因为使用起来不是很方便。 1)在插入数据时,如果字符串包含的字节数小于N,将对字符串末尾进行空字节填充。如果字符串包含的字节数大于N,将抛Too large value for FixedString(N)异常。 2)在查询数据时,ClickHouse不会删除字符串末尾的空字节。如果使用WHERE子句,则须要手动添加空字节以匹配FixedString的值(例如:where a=’abc\0’)。 注意,FixedString(N)的长度是个常量。仅由空字符组成的字符串,函数length返回值为N,而函数empty的返回值为1。
六、枚举类型
ClickHouse支持Enum8和Enum16两种枚举类型。Enum保存的是’string’=integer的对应关系。在 ClickHouse中,尽管用户使用的是字符串常量,但所有含有Enum 数据类型的操作都是按照包含整数的值来执行,这在性能方面比使用String数据类型更有效。 在ORDER BY、GROUP BY、IN、DISTINCT等函数中,Enum 的行为与相应的数字作用相同。例如,按数字排序。对于等式运算符和比较运算符,Enum 的工作机制与它们在底层数值上的工作机制相同。 Enum中的字符串和数值都不允许为NULL,当声明表字段时使用Nullable类型包含Enum类型时,在插入数据时允许NULL值。Enum类型提供toString函数来返回字符串值;toT函数可以转换为数值类型,T表示一个数值类型,如果T恰好对应Enum底层的数值类型则这个转换是0成本的。Enum类型可以使用Alter无成本修改对应集合的值,可以使用Alter来添加或删除Enum的成员(出于安全保障,如果改变之前用过的Enum会报异常),也可以用Alter将Enum8转换为Enum16或反之。 使用场景:对一些状态、类型的字段算是一种空间优化,也算是一种数据约束。但是实 际使用中往往因为一些数据内容的变化增加一定的维护成本,甚至是数据丢失问题。所以谨慎使用。
数据类型 String=Integer对应关系 取值范围 Enum8 ‘String’= Int8 -128 ~ 127 Enum16 ‘String’= Int16 -32768 ~ 32767
CREATE TABLE t_enum
( x Enum8( 'hello' = 1 , 'world' = 2 )
)
ENGINE = TinyLog;
INSERT INTO t_enum VALUES ( 'hello' ) , ( 'world' ) , ( 'hello' ) ;
insert into t_enum values( 'a' )
SELECT CAST( x, 'Int8' ) FROM t_enum;
七、时间类型
1.Date类型
ClickHouse支持Date类型,这个日期类型用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。允许存储从 Unix 纪元开始到编译阶段定义的上限阈值常量(目前上限是2106年,但最终完全支持的年份为2105),最小值输出为0000-00-00。日期类型中不存储时区信息。
2.DateTime类型
ClickHouse支持DataTime类型,这个时间戳类型用四个字节(无符号的)存储Unix时间戳。允许存储与日期类型相同范围内的值,最小值为0000-00-00 00:00:00。时间戳类型值精确到(不包括闰秒) 注意:使用客户端或服务器时的系统时区,时间戳是从文本转换为二进制并返回。在文本格式中,有关夏令时的信息会丢失。 默认情况下,客户端连接到服务的时候会使用服务端时区。您可以通过启用客户端命令行选项–use_client_time_zone 来设置使用客户端时间。 因此,在处理文本日期时(例如,在保存文本转储时),请记住在夏令时更改期间可能存在歧义,如果时区发生更改,则可能存在匹配数据的问题。
八、数组
ClickHouse支持Array(T)类型,T可以是任意类型,包括数组类型,但不推荐使用多维数组
,因为对其的支持有限(MergeTree引擎表不支持存储多维数组)
。T要求是兼容的数据类型,因为ClickHouse会自动检测并根据元素内容计算出存储这些数据的最小数据类型,如:不能使用array(1,’hello’)。 案例
SELECT array( 1 , 2 ) AS x, toTypeName( x) ;
SELECT [ 1 , 2 ] AS x, toTypeName( x) ;
九、其他数据类型
十、默认值
在ClickHouse中,对于某些类型的列,在没有显示插入值时,会自动填充默认值处理。
数据类型 String=Integer对应关系 Int和Uint 0 String 空字符串 Array 空数组 Date 0000-00-00 DateTime 0000-00-00 00:00:00 NULL 不支持