“长度”应该是多少?是为了这个 MySQL tinyblob 密钥吗?
对于我正在创建的包含 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”是错误的。
这是怎么回事,我该如何解决?
For a table I'm creating that include IP ranges, I need to store two 128-bit (16-byte) int values in a MySQL record. Since MySQL only supports up to 8-byte ints, I've found that I need to use a binary column (tinyblob), which is all well and good.
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))
);
I'm running into trouble with my unique index on these two columns. As far as I understand, IPv6's integer representation is 128 bits (16 bytes). As such, I set the unique index for the ip_start
and ip_end
columns in the unique key to be 16 bytes. Unfortunately, I end up getting duplicate key errors when populating with real IPv6 data:
> 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'
The key value displayed on the "duplicate entry" line above makes it look like a part of the ip_end
value is being lopped off. It's missing the last 13 digits: "4663175487487". This makes me think I'm wrong about the "16" that I'm providing to the unique key length representing bytes.
What's going on here, and how can I fix it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不,没有小斑点。使用 VARBINARY。
即使如此,每个数字都将存储为一个字节,因此您的密钥需要为 39B 长。
或者,您可以使用 DECIMAL(39)
或等到 MySQL 5.6 提供本机 IPv6 支持;P
No. No TINYBLOB. Use VARBINARY.
Even then, each digit will be store as one byte, so your key will need to be 39B long.
Alternatively you could use DECIMAL(39)
Or wait until MySQL 5.6 with native IPv6 support ;P