【问题标题】:What should "length" be for this MySQL tinyblob key?这个 MySQL tinyblob 键的“长度”应该是多少?
【发布时间】:2011-10-06 21:52:59
【问题描述】:

对于我正在创建的包含 IP 范围的表,我需要在 MySQL 记录中存储两个 128 位(16 字节)的 int 值。由于 MySQL 最多只支持 8 字节的整数,所以我发现我需要使用二进制列(tinyblob),这一切都很好。

CREATE TABLE `ip_ranges` (
    `ip_start` tinyblob NOT NULL,
    `ip_end` tinyblob NOT NULL,
    ...
    UNIQUE KEY `index_ip_ranges_on_ip_start_and_ip_end` (`ip_start`(16),`ip_end`(16))
);

我在这两列上的唯一索引遇到了问题。据我了解,IPv6 的整数表示是 128 位(16 字节)。因此,我将唯一键中 ip_startip_end 列的唯一索引设置为 16 个字节。不幸的是,在填充真实的 IPv6 数据时,我最终会遇到重复的键错误:

  > INSERT INTO `ip_ranges` (`ip_end`, `ip_start`, ...) VALUES ("42540649945883696925221210589465935872", "42540649945883696943667954663175487487", ...);
  Duplicate entry '42540649945883696925221210589465935872-4254064994588369694366795' for key 'index_ip_ranges_on_ip_start_and_ip_end'

上面“重复条目”行上显示的键值使它看起来像是ip_end 值的一部分正在被删除。它缺少最后 13 位数字:“4663175487487”。这让我觉得我为表示字节的唯一密钥长度提供的“16”是错误的。

这是怎么回事,我该如何解决?

【问题讨论】:

标签: mysql indexing ipv6 unique-constraint


【解决方案1】:

没有。没有 TINYBLOB。使用 VARBINARY。 即使这样,每个数字都将存储为一个字节,因此您的密钥长度需要为 39B。

您也可以使用 DECIMAL(39)

或者等到支持原生 IPv6 的 MySQL 5.6 ;P

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多