我应该选择什么数据类型在SQL Server中存储IP地址?
通过选择正确的数据类型,可以很容易地按IP地址进行过滤吗?
如果我们让用户输入几个ip范围,例如172.16.11.5 - 100,我怎么能写一个函数来检查IP(172.16.11.50)是否属于范围?
是否有任何现有的.NET库可以利用?
我怎么做?
现在,IPv6将不会被使用,但我需要设计应用程序以使其为IPv6做好准备.有必要在MySQL数据库中存储IP地址和CIDR块(也是BGP NLRI,但这是另一个故事).我总是使用INT for IPv4 +一个TINYINT用于masklen,但IPv6是128位.
最适合的方法是什么?2xBIGINT?CHAR(16)用于二进制存储?CHAR(39)用于文本存储?8xSMALLINT在专门的桌子?
你会推荐什么?
在仔细搜索之后,我注意到PHP中用于处理IPv6的功能略有不足.为了我个人的满意,我创建了一些功能来帮助过渡.
该IPv6ToLong()函数是此处提出的临时解决方案:如何在关系数据库中存储与IPv6兼容的地址.它会将IP分成两个整数并将它们返回一个数组.
/**
* Convert an IPv4 address to IPv6
*
* @param string IP Address in dot notation (192.168.1.100)
* @return string IPv6 formatted address or false if invalid input
*/
function IPv4To6($Ip) {
static $Mask = '::ffff:'; // This tells IPv6 it has an IPv4 address
$IPv6 = (strpos($Ip, '::') === 0);
$IPv4 = (strpos($Ip, '.') > 0);
if (!$IPv4 && !$IPv6) return false;
if ($IPv6 && $IPv4) $Ip = substr($Ip, strrpos($Ip, …Run Code Online (Sandbox Code Playgroud) 我正在为数据库中的网络的各个方面建模.我们正在处理的一个更烦人的问题是创建子网范围,然后确定给定的IP集合是否在这些范围内.我们当前的模型通过以下列说明了IPv4和IPv6之间的差异:
[subnet_sk] [int] IDENTITY(1,1) NOT NULL,
[ipv6_network] [char](39) NULL,
[ipv6_broadcast] [char](39) NULL,
[ipv4_network] [char](15) NULL,
[ipv4_broadcast] [char](15) NULL,
[network_type] [char](4) NOT NULL
Run Code Online (Sandbox Code Playgroud)
上面的模式做了一些重要的假设,这些假设很重要.我们正在利用完全扩展的IP(192.168.001.001vs. 192.168.1.1)进行存储和比较.我们做出这个决定是因为围绕在SQL服务器中以数字方式存储IPv6地址的问题(bigints是无符号的,这意味着我们必须使用六列来表示IPv6).
给定此表模式,可以很容易地编写一个select语句来确定任一类型的IP是否在表中的范围之间:
select *
from subnet
where '1234:0000:0000:0000:fc12:00ab:0042:1050'
between ipv6_network
and ipv6_broadcast
-- or alternatively for IPv4
select *
from subnet
where '192.168.005.015'
between ipv4_network
and ipv4_broadcast
Run Code Online (Sandbox Code Playgroud)
更为困难的是,IP列表确定哪些IP位于子网范围之间.IP列表将由用户输入提供,不存储在数据库中.显然,对于存储在数据库中的数据,我可以进行类似的连接,如下例所示.
例如,用户可以提供1234:0000:0000:0000:fc12:00ab:0042:1050,192.168.001.001和192.168.1.1.我提出的唯一解决方案是使用表值函数来拆分 IP 列表并使用以下之间执行连接:
-- this only covers the IPv4 addresses from the …Run Code Online (Sandbox Code Playgroud) 继本文之后,我有兴趣搜索IPv6地址范围.
在IPv4下,我将能够确定ISP提供的起始和结束IP地址,并使用这些整数值作为范围界限,快速搜索数据库以查看数据库中的任何条目是否落入该范围.
这将如何受到IPv6的影响?ISP仍然会像现在这样在范围内拥有IPv6地址吗?如果将IPv6地址存储为SQL Server数据库中的两个bigint,您将如何有效地搜索这些范围?