我正在开发一个具有 IPv6 模型的 Rails 应用程序。我将 IPv6 地址存储在 2 个 32 位整数和一个 64 位整数中:
+-----------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------+----------------+
| global_routing_prefix | int(11) unsigned | YES | | NULL | |
| subnet_identifier | int(11) unsigned | YES | | NULL | |
| interface_identifier | bigint(20) unsigned | YES | | NULL | |
不幸的是,当我在某个范围内查找 IP 时,MySQL 会使用带符号的 bigint 进行所有算术运算,因此:
mysql> select 2 BETWEEN 0 AND 18446744073709551614;
+--------------------------------------+
| 2 BETWEEN 0 AND 18446744073709551614 |
+--------------------------------------+
| 0 |
+--------------------------------------+
我可以做一些解决办法吗,或者我需要将interface_identifier分成2个无符号整数吗?
谢谢, 唐纳德
最佳答案
丑陋的解决方案:
select 2 BETWEEN 0 AND CAST(18446744073709551614 AS DECIMAL);
MontyAB 的人员正在为 MariaDB/MySQL 开发 native IPv6 列类型。如果您可以支持他们,我们可能会更快提供此功能。 ;)
关于MySQL BETWEEN 在无符号 bigint 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3629876/