0


1

MySQL BETWEEN on unsigned bigint

私はIPv6モデルのあるRailsアプリに取り組んでいます。 私はIPv6アドレスを2つの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つの符号なしintに分割する必要がありますか?

ありがとう、ドナルド

2 Answer


2


醜い解決策:

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

MontyABの人々は、MariaDB / MySQLのネイティブIPv6列タイプに取り組んでいます。 サポートできる場合は、この機能がすぐに提供される可能性があります。 ;)


1


「BETWEEN」を使用せずに実行すると動作するようです

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