一、整型
1、Int类型
Int的长度可以是8、16、32、64比特。比特数代表了它能存储的整形数值范围。比如,Int8的范围是-128到127,Int16的范围是-32768到32767。
CREATE TABLE IF NOT EXISTS test_int (id Int32, value Int8) ENGINE = Memory;
INSERT INTO test_int (id, value) VALUES
(1, -128), (2, 0), (3, 127);
2、UInt类型
与Int类型相比,UInt类型并没有负数,因此它的范围是0到2^(n)-1,其中n是比特数。例如,UInt8的范围是0到255。
CREATE TABLE IF NOT EXISTS test_uint (id Int32, value UInt8) ENGINE = Memory;
INSERT INTO test_uint (id, value) VALUES
(1, 0), (2, 127), (3, 255);
二、浮点型
1、Float类型
Float类型是一种单精度浮点数,其长度为32比特。它能够存储大约6到7位的有效数字。
CREATE TABLE IF NOT EXISTS test_float (id Int32, value1 Float32, value2 Float32) ENGINE = Memory;
INSERT INTO test_float (id, value1, value2) VALUES
(1, 1.23456789, 1234567.89),
(2, 1.23400001, 1234567.90),
(3, 1.23456784, 1234566.89);
2、Double类型
Double类型是一种双精度浮点数,其长度为64比特,能够存储大约15到16位的有效数字。
CREATE TABLE IF NOT EXISTS test_double (id Int32, value1 Float, value2 Float64) ENGINE = Memory;
INSERT INTO test_double (id, value1, value2) VALUES
(1, 1.23456789012345, 1234567890.12345),
(2, 1.234000000001, 1234567890.12346),
(3, 1.2345678901234, 1234567889.12345);
三、日期和时间型
1、Date类型
Date类型存储日期,长度为16比特。它的取值范围为0000-01-01到9999-12-31。
CREATE TABLE IF NOT EXISTS test_date (id Int32, value Date) ENGINE = Memory;
INSERT INTO test_date (id, value) VALUES
(1, toDate('2020-01-01')),
(2, toDate('2021-12-31')),
(3, toDate('2022-02-01'));
2、DateTime类型
DateTime类型存储日期和时间,长度为32比特。它的取值范围为1970-01-01 00:00:00到2105-12-31 23:59:59。
CREATE TABLE IF NOT EXISTS test_datetime (id Int32, value DateTime) ENGINE = Memory;
INSERT INTO test_datetime (id, value) VALUES
(1, toDateTime('2020-01-01 12:30:00')),
(2, toDateTime('2021-12-31 23:59:59')),
(3, toDateTime('2022-02-01 01:30:30'));
四、字符串和二进制型
1、String类型
String类型存储字符串,长度不超过2^30字节。在ClickHouse中,String类型的底层是使用Variable-length encoding(可变长度编码)来实现的。
CREATE TABLE IF NOT EXISTS test_string (id Int32, value String) ENGINE = Memory;
INSERT INTO test_string (id, value) VALUES
(1, 'Hello, world!'),
(2, '中文测试'),
(3, '1234567890');
2、FixedString类型
FixedString类型是固定长度的字符串类型,长度在定义表时即可确定。因为长度是固定的,所以FixedString类型的存储比String类型的更紧凑。
CREATE TABLE IF NOT EXISTS test_fixedstring (id Int32, value FixedString(5)) ENGINE = Memory;
INSERT INTO test_fixedstring (id, value) VALUES
(1, 'Hello'),
(2, 'World'),
(3, '12345');
3、Tuple类型
Tuple类型用于存储具有不同类型的数据的元组。Tuple的长度可以是不同的,而且还可以嵌套起来,实现复杂的数据结构。
CREATE TABLE IF NOT EXISTS test_tuple (id Int32, value Tuple(Int32, String)) ENGINE = Memory;
INSERT INTO test_tuple (id, value) VALUES
(1, (1, 'Hello')),
(2, (2, 'World')),
(3, (3, 'ClickHouse'));
4、Array类型
Array类型用于存储具有相同类型的数据的数组,长度可以是不同的。
CREATE TABLE IF NOT EXISTS test_array (id Int32, value Array(String)) ENGINE = Memory;
INSERT INTO test_array (id, value) VALUES
(1, ['hello', 'world', '!']),
(2, ['Click', 'House']),
(3, []);
5、Nullable类型
Nullable类型用于存储可空类型的数据,即数据中可能存在空值。在ClickHouse中,Nullable类型只用于基本类型和Date、DateTime和String类型。
CREATE TABLE IF NOT EXISTS test_nullable (id Int32, value Nullable(String)) ENGINE = Memory;
INSERT INTO test_nullable (id, value) VALUES
(1, 'hello'),
(2, NULL),
(3, 'world');
6、LowCardinality类型
LowCardinality类型用于在存储无序的字符串类型时,优化字典压缩效率。当一个字符串类型的值只有几种取值时,使用LowCardinality类型可以让查询变得更快。
CREATE TABLE IF NOT EXISTS test_lowcardinality (id Int32, value LowCardinality(String)) ENGINE = Memory;
INSERT INTO test_lowcardinality (id, value) VALUES
(1, 'hello'),
(2, 'ClickHouse'),
(3, 'world');
五、其他类型
1、IPv4类型
IPv4类型用于存储IPv4地址。
CREATE TABLE IF NOT EXISTS test_ipv4 (id Int32, ip IPv4) ENGINE = Memory;
INSERT INTO test_ipv4 (id, ip) VALUES
(1, toIPv4('192.168.1.1')),
(2, toIPv4('172.16.0.1')),
(3, toIPv4('10.0.0.1'));
2、UUID类型
UUID类型用于存储UUID(Universally Unique Identifier,通用唯一识别码)。
CREATE TABLE IF NOT EXISTS test_uuid (id Int32, uuid UUID) ENGINE = Memory;
INSERT INTO test_uuid (id, uuid) VALUES
(1, '5405b6f2-36c3-11eb-adc1-0242ac120002'),
(2, 'ccaa0c47-36c3-11eb-adc1-0242ac120002'),
(3, 'ec42737a-36c3-11eb-adc1-0242ac120002');
以上就是ClickHouse的数据类型的详细介绍,包括整型、浮点型、日期时间型、字符串和二进制型、其他类型。在使用ClickHouse时,需要根据实际情况选用合适的数据类型来存储数据,以便提高查询和存储效率。