MySQL МЕЖДУ неподписанным bigint

Я работаю над приложением rails с моделью IPv6. Я сохраняю адрес IPv6 в двух 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 беззнаковых целых числа?

Спасибо, Дональд


person Donald Plummer    schedule 02.09.2010    source источник


Ответы (2)


Делать это без использования BETWEEN, кажется, работает

mysql> select 0 <= 2 and 2 <= 18446744073709551614;
+--------------------------------------+
| 0 <= 2 and 2 <= 18446744073709551614 |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
person Matti Virkkunen    schedule 02.09.2010

Уродливое решение:

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

Сотрудники MontyAB работают над родным типом столбца IPv6 для MariaDB/MySQL. Если вы сможете их поддержать, мы, скорее всего, добавим эту функцию раньше. ;)

person Mchl    schedule 02.09.2010