这个问题已经有一个答案在这里:

应该是什么大多数数据类型的建议,用于储存IPv4address in SQL服务器?

或者,也许有人已经创建了一个用户SQL数据类型(.净组件)?

我不需要分拣。

有帮助吗?

解决方案

存储IPv4作为一个地址 binary(4)是最真实的,它代表什么,以及允许容易网的掩模式查询。但是,它需要转换,在出如果你实际上是在后一个案文表示。在这种情况下,你可能更喜欢一串的格式。

一点用SQL服务器的功能,可能会帮助如果你被储存作为一个字符串 PARSENAME, 通过这种方式。非设计用于IP地址但完全适合于他们。呼叫下面将返回14':

SELECT PARSENAME('123.234.23.14', 1)

(编号是右到左边)。

其他提示

我通常只是用varchar(15)对于IPv4addresses-但是它们进行排序是一个痛苦除非你垫零。

我还保存它们作为一个INT在过去。 System.Net.IPAddress 有一个 GetAddressBytes 方法,这将返回的IP地址作为一系列的4个字节表示的IP地址。你可以用下面C#代码转换一个 IPAddress 来一个 int...

var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);

我用了,因为我已经做了很多寻找欺骗的地址,并且希望索引将作为小型和快速的成为可能。然后拉的地址回了int和成 IPAddress 对象。净,使用 GetBytes 方法上的 BitConverter 获得int作为一个字阵列。通过那个字阵列 构造 对于 IPAddress 这需要一个字阵列,和你回来了 IPAddress 你开始。

var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));

关于这一评论中所接受的答案

它们进行排序是一个痛苦除非你垫 零。

这里有一个招SQL服务器2008年(从伊茨克Ben-Gan在 这本书)

with ip_addresses as
(
SELECT '131.33.2.201' AS ip_address UNION ALL
SELECT '2.12.4.4' AS ip_address UNION ALL
SELECT '131.33.2.202' AS ip_address UNION ALL
SELECT '2.12.4.169' AS ip_address UNION ALL
SELECT '131.107.2.201' AS ip_address 
)
select ip_address
from ip_addresses
ORDER  BY CAST('/' + ip_address + '/' AS hierarchyid)

返回

ip_address
-------------
2.12.4.4
2.12.4.169
131.33.2.201
131.33.2.202
131.107.2.201

我最喜欢的一个 文章 谈到为什么你不应该用经常表达的分析IP地址。大多数什么他们谈论的是真正解释为什么你应当非常小心的文字表述的IP地址。我建议你阅读它,然后才决定什么类型的使用在你的数据库,而且可能也无论出于何处理您的程序将是这样做(即使这篇文章是写关于Perl,它有用的任何语言)。

我想在结束一个32位数据类型(或四个8位数据类型)将是最好的选择。

IPV4?int?或指定列的值x4吗?

这真的取决于它是否只是储存和检索,或者如果它将是一个远程搜索标准。

不要忘了IPv6-你需要更多的空间如果你需要它们存储-128bits比较IPv4的32个。

我会去bigint,但你会需要一些帮助者的代码翻译成人友好的版本。

我读了很多类似的问题在这里并且没有答复在这一提号一个答案在其他:"IPv4addresses,您可能想要保存它们作为一个int未签署和使用INET_ATON()和INET_NTOA()功能返回的IP地址从其数值,反之亦然。" 我觉得这是什么,我要与在我的数据库,除非我决定使用php功能上文所述。

最好的方法(时不需要分拣和其他控制在IPs)是 存储为int, ,储存作为varchar等。会费用的方式更多的性能不仅仅是一个简单的无辜int。

有一个酒店 IPAddress.Address 但是,这是过时的,我不知道为什么,因为如果你不需要分类或控制的IP类,最好的方式是商店,它作为unsigned integer(即具有最大的价值 0xffffffff 这等于 255.255.255.255 在小数表示。

还IPAddress类有一个构造,可接受一个漫长的争论。

并根据VS调试器的展台,这IPAddress类本身的存储其内部变为一个数字(不byte array)。

阅读更多的存储解决办法的一个单元在MS SQL服务器:

对于空间高效率的存储和当值来加以处理(匹配或相比范围),我用一个 int.IP地址真的只是一个32位数值。

对于一个简单的解决方案,其中你只是想商店的价值观,我用一个 varchar(15) 储存的串表示的IP地址。

我已经取得了一些成功,与四个smallint(或什么小你喜欢整数数据类型)列--一个每个八位字节。然后,你可以做一个看这捣毁他们一起作为一个字符串(用于显示的)或者然后可以编写简单的运营商来确定谁是什么样子网等。

它是相当快的速度(提供做适当的索引),并还允许真的很容易查询(没有串操纵!).

由于一个IP地址,有32位,可以你只用一个长期储存的数值价值?
它不会被视为空间-浪费的使用VARCHAR,但是然后你就会有解码这回IP在你面前使用它,每一个时间,并延迟和开销的费用不可能是值得的。

最适当的数据类型,用于储存IPv4address在一个数据库的数据库,是一个 int.唯一的繁琐位转换回来的虚符号用于显示/排序,因此我建议创建一个看法,即可自动执行这个给你。

我可能会去 varcharchar.

和设置的大到15个。

引述 :

储存的IP地址是在一个CHAR(15)列。取决于你有多少数据存储,这可能是相当浪费(为什么我们需要储存点?).我

我的新手@php,sql,但我觉得最快的方式来存储的东西在sql数据库是要将其转换为int值和节省作为诠释。

我用功能在php-

function ip_convert() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $intip = str_replace(".","0",$ip);
    return $intip;
}

然后我只是替换所有的点零。然后如果我需要使用这个ip从sql..if($ip==ip_convert())

但是,这只是如果您使用的PHP.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top