zoukankan      html  css  js  c++  java
  • MySQL怎样存储IP地址

    为什么要问如何存储IP

    首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗?

    其实做任何程序设计都要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升。

    利用函数算法处理

    在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少空间。因为varchar是可变长形,需要多余的一个字节存储长度。另外int型在逻辑运算上要比varchar速度快。

    IP转数字函数inet_aton()

    我们转换下几个常用的IP地址

    01 mysql> select inet_aton('255.255.255.255');
    02 +------------------------------+
    03 | inet_aton('255.255.255.255') |
    04 +------------------------------+
    05 |                   4294967295 |
    06 +------------------------------+
    07 1 row in set (0.00 sec)
    08  
    09 mysql> select inet_aton('192.168.1.1');   
    10 +--------------------------+
    11 | inet_aton('192.168.1.1') |
    12 +--------------------------+
    13 |               3232235777 |
    14 +--------------------------+
    15 1 row in set (0.00 sec)
    16  
    17 mysql> select inet_aton('10.10.10.10');
    18 +--------------------------+
    19 | inet_aton('10.10.10.10') |
    20 +--------------------------+
    21 |                168430090 |
    22 +--------------------------+
    23 1 row in set (0.00 sec)

    所以IP的表字段可以设置为INT(10)就好,如果IP获取不到可以直接存0代表获取不到IP的意思

    数字转IP函数inet_ntoa()

    01 mysql> select inet_ntoa(4294967295);
    02 +-----------------------+
    03 | inet_ntoa(4294967295) |
    04 +-----------------------+
    05 | 255.255.255.255       |
    06 +-----------------------+
    07 1 row in set (0.00 sec)
    08  
    09 mysql> select inet_ntoa(3232235777);
    10 +-----------------------+
    11 | inet_ntoa(3232235777) |
    12 +-----------------------+
    13 | 192.168.1.1           |
    14 +-----------------------+
    15 1 row in set (0.00 sec)
    16  
    17 mysql> select inet_ntoa(168430090);
    18 +----------------------+
    19 | inet_ntoa(168430090) |
    20 +----------------------+
    21 | 10.10.10.10          |
    22 +----------------------+
    23 1 row in set (0.00 sec)
    24  
    25 mysql> select inet_ntoa(0);       
    26 +--------------+
    27 | inet_ntoa(0) |
    28 +--------------+
    29 | 0.0.0.0      |
    30 +--------------+
    31 1 row in set (0.00 sec)

    注意,0转换为 0.0.0.0

    整型字段的比较比字符串效率高很多,这也符合一项优化原则:字段类型定义使用最合适(最小),最简单的数据类型。
    inet_aton()算法,其实借用了国际上对各国IP地址的区分中使用的ip number。
    a.b.c.d 的ip number是:
    a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。

  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/raobenjun/p/7729602.html
Copyright © 2011-2022 走看看