zoukankan      html  css  js  c++  java
  • 如何在数据库中存储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[]互转的简单方法:

      

            /// <summary>
            /// IP转换字节
            /// </summary>
            /// <param name="ip"></param>
            /// <returns></returns>
            public static byte[] ParseByte(string ip)
            {
                return System.Net.IPAddress.Parse(ip).GetAddressBytes();
            }    
            /// <summary>
            /// 字节转换IP字符串(未检查是否合法)
            /// </summary>
            /// <param name="b"></param>
            /// <returns></returns>
            public static string ParseIp(byte[] b)
            {
                if (b == null || b.Length < 0)
                    return "";
                string ipstr = "";
                foreach (var _b in b)
                {
                    ipstr += _b.ToString() + ".";
                }
                return ipstr.TrimEnd('.');
            }

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

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

      

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

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

      这样问题就都解决了。

  • 相关阅读:
    基于Mybatis3.0.6的基本操作介绍
    正则验证邮箱格式是不是正确
    Linux_文件权限
    飘逸的python
    通过Fsharp探索Enterprise Library Exception
    Oracle学习——扫盲篇
    代码块练习题:看代码写程序的执行结果。
    代码块:在Java中用{}括起来的代码
    Java中如何使用帮助文档(API)
    Java如何制作帮助文档(API)
  • 原文地址:https://www.cnblogs.com/xiejb/p/3421646.html
Copyright © 2011-2022 走看看