IPv4

IPv4是与UInt32类型保持二进制兼容的Domain类型,其用于存储IPv4地址的值。它提供了更为紧凑的二进制存储的同时支持识别可读性更加友好的输入输出格式。

基本使用

CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY url;

DESCRIBE TABLE hits;
┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐
 url   String                                                              
 from  IPv4                                                                
└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┘

同时您也可以使用IPv4类型的列作为主键:

CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY from;

在写入与查询时,IPv4类型能够识别可读性更加友好的输入输出格式:

INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '116.253.40.133')('https://clickhouse.yandex', '183.247.232.58')('https://clickhouse.yandex/docs/en/', '116.106.34.242');

SELECT * FROM hits;
┌─url────────────────────────────────┬───────────from─┐
 https://clickhouse.yandex/docs/en/  116.106.34.242 
 https://wikipedia.org               116.253.40.133 
 https://clickhouse.yandex           183.247.232.58 
└────────────────────────────────────┴────────────────┘

同时它提供更为紧凑的二进制存储格式:

SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
┌─toTypeName(from)─┬─hex(from)─┐
 IPv4              B7F7E83A  
└──────────────────┴───────────┘

不可隐式转换为除UInt32以外的其他类型类型。如果要将IPv4类型的值转换成字符串,你可以使用IPv4NumToString()显示的进行转换:

SELECT toTypeName(s), IPv4NumToString(from) as s FROM hits LIMIT 1;
┌─toTypeName(IPv4NumToString(from))─┬─s──────────────┐
 String                             183.247.232.58 
└───────────────────────────────────┴────────────────┘

或可以使用CAST将它转换为UInt32类型:

SELECT toTypeName(i), CAST(from as UInt32) as i FROM hits LIMIT 1;
┌─toTypeName(CAST(from, 'UInt32'))─┬──────────i─┐
 UInt32                            3086477370 
└──────────────────────────────────┴────────────┘