“应该怎么做?”;“长度”;是否使用此MySQL tinyblob密钥?

“应该怎么做?”;“长度”;是否使用此MySQL tinyblob密钥?,mysql,indexing,ipv6,unique-constraint,Mysql,Indexing,Ipv6,Unique Constraint,对于我正在创建的包含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_en

对于我正在创建的包含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字节)。因此,我将unique键中的
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\u端的一部分。它缺少最后13位数字:“4663175487487”。这让我觉得我对表示字节的唯一密钥长度提供的“16”是错误的


这里发生了什么事,我该如何修复它?

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

或者,您可以使用十进制(39)

或者等到MySQL 5.6支持本机IPv6时再使用;P另见: