【发布时间】: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_start 和 ip_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