MySQL BETWEEN 在无符号 bigint 上

标签 mysql ipv6 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个无符号整数吗?

谢谢, 唐纳德

最佳答案

丑陋的解决方案:

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

MontyAB 的人员正在为 MariaDB/MySQL 开发 native IPv6 列类型。如果您可以支持他们,我们可能会更快提供此功能。 ;)

关于MySQL BETWEEN 在无符号 bigint 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3629876/

相关文章:

mysql - 使用存储过程或查询

mysql - 在sql查询中查找字符串末尾的子字符串

mysql - 错误代码 : 1290. MySQL 服务器正在使用 --secure-file-priv 选项运行,因此无法执行此语句

MySQL求和与更新

c++ - 系统上只有 IPv6 地址可用时的 AF_INET 套接字?

javascript - 如何将 JavaScript BigInt 值转换为科学记数法?

ruby-on-rails - 获取 "value "300000200 0"is out of range for type integer"

sql-server - SQL Server相关表主键由GUID改为BigInt的方法

ios - 在 iOS 中通过 ipv4 而不是 ipv6 路由网络

http - 如何将本地 ipv6 地址绑定(bind)到我的 node.js 程序?