首页 新闻 会员 周边

请教IP6地址存储问题

0
悬赏园豆:20 [已解决问题] 解决于 2011-11-23 14:49

用的是MSSQL数据库,设计数据时IP字段用的是bigint,转换方法跟这个类似:http://www.cnblogs.com/jillzhang/archive/2007/10/24/935621.html

用IP4时没问题,现在的问题是,当用户用的是IPV6时,就会出现转换错误:

Error converting data type varchar to bigint.

请教方案?

artwl的主页 artwl | 专家六级 | 园豆:16736
提问于:2011-11-21 15:50
< >
分享
最佳答案
0

IPV6地址需要占用128位16字节,因此肯定不能用bigint(只有64位8字节),建议IPV6字段用binary(16)。

如果使用.net编程,那么使用System.Net.IPAddress,可以方便地在string和byte[]表示方法中切换;

如果你将IPV4和IPv6地址放在同一列中,那么可以使用varbinary(16)。

代码示例:

            IPAddress address1 = IPAddress.Parse("3ffe:3201:1401:1:280:c8ff:fe4d:db39");
IPAddress address2 = IPAddress.Parse("192.168.10.123");

byte[] bytes1 = address1.GetAddressBytes();
byte[] bytes2 = address2.GetAddressBytes();

Trace.WriteLine(address1.ToString() == new IPAddress(bytes1).ToString());
Trace.WriteLine(address2.ToString() == new IPAddress(bytes2).ToString())
收获园豆:20
ChatinCode | 老鸟四级 |园豆:2272 | 2011-11-23 14:38

明白,收到,谢谢!!!

artwl | 园豆:16736 (专家六级) | 2011-11-23 14:49

@artwl: http://www.cnblogs.com/jillzhang/archive/2007/10/24/935621.html

这个方法使用bigint储存IPV4的地址也有点不大对劲的,其实只要int就可以了,如果使用int在存储空间和比较上面都会有速度提升的。

ChatinCode | 园豆:2272 (老鸟四级) | 2011-11-23 15:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册