IPv6

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

基本用法

  1. CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY url;
  2. DESCRIBE TABLE hits;
  1. ┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐
  2. url String
  3. from IPv6
  4. └──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┘

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

  1. CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY from;

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

  1. INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '2a02:aa08:e000:3100::2')('https://clickhouse.yandex', '2001:44c8:129:2632:33:0:252:2')('https://clickhouse.yandex/docs/en/', '2a02:e980:1e::1');
  2. SELECT * FROM hits;
  1. ┌─url────────────────────────────────┬─from──────────────────────────┐
  2. https://clickhouse.yandex │ 2001:44c8:129:2632:33:0:252:2 │
  3. https://clickhouse.yandex/docs/en/ │ 2a02:e980:1e::1 │
  4. https://wikipedia.org │ 2a02:aa08:e000:3100::2 │
  5. └────────────────────────────────────┴───────────────────────────────┘

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

  1. SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
  1. ┌─toTypeName(from)─┬─hex(from)────────────────────────┐
  2. IPv6 200144C8012926320033000002520002
  3. └──────────────────┴──────────────────────────────────┘

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

  1. SELECT toTypeName(s), IPv6NumToString(from) as s FROM hits LIMIT 1;
  1. ┌─toTypeName(IPv6NumToString(from))─┬─s─────────────────────────────┐
  2. String 2001:44c8:129:2632:33:0:252:2
  3. └───────────────────────────────────┴───────────────────────────────┘

或使用CAST将其转换为FixedString(16)

  1. SELECT toTypeName(i), CAST(from as FixedString(16)) as i FROM hits LIMIT 1;
  1. ┌─toTypeName(CAST(from, 'FixedString(16)'))─┬─i───────┐
  2. FixedString(16) ���
  3. └───────────────────────────────────────────┴─────────┘

来源文章