ip在mysql数据库怎么存_如何在数据库中存储IP地址

最近改一个比较老的web系统,该系统是通过账号或者ip地址(白名单)验证限制访问权限的。

由于运营的时间比较长了,发现进入网站巨卡...

原因就是:之前的数据库(sqlserver)存储ip地址是用的字符串类型,而且ip段被分解成了单个的ip存储起来,这样导致了巨大的数据量,比如(192.168.0.1-192.168.0.100),这样分解后存储会产生100条数据,导致在验证用户的时候查询超慢。

解决方法:

1:将ip地址存储类型改为varbinary(4)类型(未考虑ipv6),因为ip地址正好可以转换成长度为4的十六进制字节数组。

varbinary对应c#类型为byte[],下面是string byte[]互转的简单方法:

///

///IP转换字节///

///

///

public static byte[] ParseByte(stringip)

{returnSystem.Net.IPAddress.Parse(ip).GetAddressBytes();

}

///

///字节转换IP字符串(未检查是否合法)///

///

///

public static string ParseIp(byte[] b)

{if (b == null || b.Length < 0)return "";string ipstr = "";foreach (var _b inb)

{

ipstr+= _b.ToString() + ".";

}return ipstr.TrimEnd('.');

}

如此将字符串ip转换后可以直接当参数传递给sql语句进行查询。

2:ip段不再分解,而是用起始ip和结束ip两个字段来存储。

02081e2ea98fa8ca69cb24b8190b7102.png

字节类型可以直接用来比较:

select * from Ip where IpStart <= @ip and IpEnd >= @ip

这样问题就都解决了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值