MySQL МЕЖДУ неподписанным bigint - PullRequest
0 голосов
/ 02 сентября 2010

Я работаю над приложением rails, которое имеет модель IPv6.Я храню IPv6-адрес в 2-х 32-битных и 64-битных int:

+-----------------------+---------------------+------+-----+---------+----------------+
| 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 выполняет всю арифметику со знаком bigints,:

mysql> select 2 BETWEEN 0 AND 18446744073709551614;
+--------------------------------------+
| 2 BETWEEN 0 AND 18446744073709551614 |
+--------------------------------------+
|                                    0 | 
+--------------------------------------+

Есть ли обходной путь, который я могу сделать, или мне нужно разделить interface_identifier на 2 неподписанных целых числа?

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

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

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

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

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

1 голос
/ 02 сентября 2010

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

mysql> select 0 <= 2 and 2 <= 18446744073709551614;
+--------------------------------------+
| 0 <= 2 and 2 <= 18446744073709551614 |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
...