“长度”应该是多少?是为了这个 MySQL tinyblob 密钥吗?

发布于 2024-11-24 15:25:51 字数 950 浏览 1 评论 0原文

对于我正在创建的包含 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”是错误的。

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

在你怀里撒娇 2024-12-01 15:25:51

不,没有小斑点。使用 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文