这个问题已经在这里有一个答案:
- 数据类型在SQL Server中存储的IP地址 10个回答
应该是什么在SQL服务器存储IPv4地址的最值得推荐的数据类型?
或者,也许有人已经创造了其用户的SQL数据类型(.NET程序集)?
我不需要排序。
这个问题已经在这里有一个答案:
应该是什么在SQL服务器存储IPv4地址的最值得推荐的数据类型?
或者,也许有人已经创造了其用户的SQL数据类型(.NET程序集)?
我不需要排序。
储存的IPv4地址为binary
(4)是最真实的,以所代表的,并可以很方便子网掩码式查询。 然而,这需要转换进出,如果你一个文本表示以后实际上是。 在这种情况下,你可能更喜欢一个字符串格式。
很少使用SQL Server的功能,如果你是存储为一个字符串,这可能有助于为PARSENAME
,顺便说一句。 不是专为IP地址,但完全适合他们。 下面的调用将返回“14”:
SELECT PARSENAME('123.234.23.14', 1)
(编号是从右到左)。
我通常只使用VARCHAR(15),用于IPv4地址 - 但它们排序是,除非你垫零痛苦。
我也将它们存储在过去的INT。 System.Net.IPAddress
具有GetAddressBytes
方法,该方法将返回的IP地址作为4个字节表示的IP地址的阵列。 您可以使用下面的C#代码到转换IPAddress
到int
...
var ipAsInt = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
我用了,因为我必须做搜索欺骗地址的很多,并希望索引尽可能小和快越好。 然后拉地址返出的int并进入IPAddress
在.NET对象,使用GetBytes
上方法BitConverter
获得INT作为字节数组。 传递字节数组构造的IPAddress
,需要一个字节数组,你最终备份与IPAddress
,你开始。
var myIp = new IPAddress(BitConverter.GetBytes(ipAsInt));
关于接受的答案这条评论
对它们进行排序除非你垫零痛苦。
下面是SQL Server 2008的把戏(从伊茨克奔甘在这本书 )
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位的数据类型(或4个8位的数据类型)将是最好的选择。
IPV4? 诠释? 或TINYINT×4?
这真的取决于它是否只是存储和检索,或者如果它要成为一个范围搜索条件。
Don't forget about IPv6 - you need a lot more room if you need to store them - 128bits compares to IPv4's 32.
I'd go for bigint, though you will need some helper code to translate to human friendly versions.
我读了很多关于这里类似的问题,并没有在这一个答复提到在别人一个回答:“对于IPv4地址,您可能希望将其存储为一个int无符号和使用INET_ATON()和INET_NTOA()函数来从它的数值返回的IP地址,反之亦然。” 我想这就是我要与走在我的分贝,除非我决定使用上面提到的PHP函数。
最好的办法(当不需要分类和对IP地址等控制)是其存储为整型 ,将其存储为varchar等的成本比只是一个简单的无辜INT方式更高的性能。
有一个属性IPAddress.Address
但它是过时的,我不知道是什么原因,因为如果你不需要在IP类排序或控制,最好的办法是将其存储为无符号整数(即具有的最大值0xffffffff
其等于255.255.255.255
在十进制表示。
此外IPAddress类具有接受一个long参数的构造函数。
并根据VS调试器可视,即的IPAddress类本身存储其内部变量作为一个数字(未字节数组)。
了解更多关于解决方法存储单元中的MS SQL Server:
对于空间高效存储以及当所述值是要被处理(匹配或比较的范围)中,我使用的int
。 IP地址真的只是一个32位值。
对于一个简单的解决方案,你只是想存储的值来查看它,我用一个varchar(15)
存储IP地址的字符串表示。
我已经取得了一些成功使4个SMALLINT(或任何短小的整数数据类型,你喜欢)列 - 每个八位字节。 然后,你可以让它们一起捣毁它们作为一个字符字符串(显示)的图或则你可以写简单的运营商,以确定谁是所有子网等什么
这是相当快的(前提是你做正确的索引)也允许很容易查询(没有字符串操作!)。
由于IP地址有32位吧,你能只使用一个LONG来存储数值?
它不会是因为空间的浪费使用VARCHAR,但你不得不将其解码回一个IP使用前,每一次,延迟和开销成本可能不值得。
用于在MSSQL数据库中存储的IPv4地址的最适当的数据类型,是一个int
。 唯一的繁琐位将其转换回点号进行显示/排序,所以我建议你创建一个自动执行此为您的视图。
我可能有去varchar
或char
。
和大小设置为15。
引用此 :
在CHAR(15)列存储的IP地址。 取决于你有多少数据存储,这可能是非常浪费的(为什么我们需要存储的点?)。 一世
我是新手@ PHP,SQL,但我认为存储在SQL数据库的东西最快的方法是将其转换为int值,并保存为int类型。
我在PHP中使用的功能 -
function ip_convert() {
$ip = $_SERVER['REMOTE_ADDR'];
$intip = str_replace(".","0",$ip);
return $intip;
}
然后我就用零代替所有点。 然后,如果我需要使用此IP从SQL ..如果($知识产权== ip_convert())
但是,这只有在使用PHP。