Mysql entre em bigint não assinado
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
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