Pergunta

Estou trabalhando em um aplicativo Rails que possui um modelo IPv6. Estou armazenando o endereço IPv6 em 2 INTs de 32 bits e um Int de 64 bits:

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

Infelizmente, quando vou encontrar o IPS em um intervalo, o MySQL faz toda a aritmética com bigints assinados, então:

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

Existe um trabalho por aí que eu posso fazer, ou preciso dividir por interface_entifier em 2 ints não assinados?

Obrigado, Donald

Foi útil?

Solução

Fazendo isso sem usar BETWEEN parece funcionar

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

Outras dicas

Solução feia:

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

As pessoas da Montyab estão trabalhando no tipo de coluna IPv6 nativo para MariaDB/MySQL. Se você puder apoiá -los, é provável que tenhamos esse recurso mais cedo. ;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top