2010-09-02 12 views
0

Je travaille sur une application rails qui a un modèle IPv6. Je stocker l'adresse IPv6 dans 2 ints 32 bits et un entier 64 bits:MySQL BETWEEN sur unsigned bigint

+-----------------------+---------------------+------+-----+---------+----------------+ 
| 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 |    | 

Malheureusement, quand je vais trouver les adresses IP dans une gamme, MySQL fait toutes les opérations arithmétiques avec bigints signés, donc:

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

Y a-t-il un travail autour de ce que je peux faire, ou dois-je séparer par interface_identifier en 2 ints non signés?

Merci, Donald

Répondre

1

Le faire sans utiliser BETWEEN semble fonctionner

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

solution truand:

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

personnes à MontyAB travaillent sur le type de colonne IPv6 native pour MariaDB/MySQL Si vous pouvez les supporter, nous aurons probablement cette fonctionnalité plus tôt. ;)