0

IPv6 モデルを持つレール アプリに取り組んでいます。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 つの unsigned int に分割する必要がありますか?

ありがとう、ドナルド

4

2 に答える 2

2

醜い解決策:

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

MontyAB の人々は、MariaDB/MySQL のネイティブ IPv6 列タイプに取り組んでいます。それらをサポートしていただければ、この機能をより早く実装できる可能性があります。;)

于 2010-09-02T18:27:06.260 に答える
1

使わずにやるとうまくいくBETWEENようです

mysql> select 0 <= 2 and 2 <= 18446744073709551614;
+--------------------------------------+
| 0 <= 2 and 2 <= 18446744073709551614 |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
于 2010-09-02T18:12:59.650 に答える