0

我正在开发一个具有 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 个无符号整数?

谢谢,唐纳德

4

2 回答 2

2

丑陋的解决方案:

select 2 BETWEEN 0 AND CAST(18446744073709551614 AS DECIMAL);

MontyAB 的人员正在为 MariaDB/MySQL 开发原生 IPv6 列类型。如果您能支持他们,我们很可能会尽快推出此功能。;)

于 2010-09-02T18:27:06.260 回答
1

不使用就这样做BETWEEN似乎有效

mysql> select 0 <= 2 and 2 <= 18446744073709551614;
+--------------------------------------+
| 0 <= 2 and 2 <= 18446744073709551614 |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
于 2010-09-02T18:12:59.650 回答