• IP地址在数据库里面的存储方式


    大多数公司的表结构都需要经过DBA进行审核,有时候你会看到存储IP地址采用varchar(15),这种方式都是传统的做法,这种方法需要占用15个字节,那么有更省空间的做法么?肯定是有的,那就是用int存储。如果采用int存储这里又有2种处理方式。

    1. 利用MySQL函数进行处理。可以采用INET_ATON,INET_NTOA函数进行转换。

    2. 利用开发语言的函数进行处理,以php进行举例。可以采用ip2long,long2ip函数进行转换。

    上面2种方法得到的结果都是一致的。因为算法都是一样的。

    下面进行函数用法的演示。首先看看用MySQL自己的函数如何玩。先把ip地址转换int。

    mysql> SELECT INET_ATON('192.168.0.1');
    +--------------------------+
    | INET_ATON('192.168.0.1') |
    +--------------------------+
    |               3232235521 |
    +--------------------------+
    1 row in set (0.00 sec)
    
    mysql> 

    然后把int类型转换为ip地址:

    mysql> SELECT INET_NTOA(3232235521);  
    +-----------------------+
    | INET_NTOA(3232235521) |
    +-----------------------+
    | 192.168.0.1           |
    +-----------------------+
    1 row in set (0.00 sec)
    
    mysql> 

    下面看php函数的使用:

    <?php
    echo ip2long('192.168.0.1');
    ?>
    php test.php 
    3232235521

    可以看到结果是一样的,如果要把整形转换为ip地址,再使用php的long2ip()就行,这里就不再写了。
    MySQL存储这个值是字段需要用int UNSIGNED。不用UNSIGNED的话,128以上的IP段就存储不了。当然可以使用bigint,但是请记住,能抠门就要抠门。省一点是一点,哈哈。

    PHP存入时:$ip = ip2long($ip);
    MySQLl取出时:SELECT INET_ATON(ip) FROM table ...
    PHP取出时,多一步:$ip = long2ip($ip);

    那么以前就是varchar类型,那么如何转换呢?下面慢慢道来。

    1. 把以前的varchar()数据转换为int型的SQL语句如下。

    UPDATE t1 SET ip =  INET_ATON(ip) WHERE INET_ATON(ip) is NOT NULL ;
    mysql> select * from t1;
    +------+-------------+
    | id   | ip          |
    +------+-------------+
    |    1 | 192.168.0.1 |
    |    2 | 192.168.0.2 |
    +------+-------------+
    2 rows in set (0.00 sec)
    
    mysql> UPDATE t1 SET ip =  INET_ATON(ip) WHERE INET_ATON(ip) is NOT NULL ;         
    Query OK, 2 rows affected (0.00 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    
    mysql> select * from t1;
    +------+------------+
    | id   | ip         |
    +------+------------+
    |    1 | 3232235521 |
    |    2 | 3232235522 |
    +------+------------+
    2 rows in set (0.00 sec)

    2. 把字段改为INT类型。

    mysql> show create table t1G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `id` int(11) DEFAULT NULL,
      `ip` varchar(15) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    ALTER TABLE `t1` modify ip INT UNSIGNED NOT NULL;

    3. 程序代码改动。

    总结:

    字段类型用合适的,够用就行,能省则省,在数据量上去以后,10个字节和5个字节相差的数据量会让你吃惊。


                                  

  • 相关阅读:
    洛谷 P1401 城市(二分+网络流)
    洛谷 P2057 善意的投票(网络流最小割)
    洛谷 P1402 酒店之王
    二分图最大匹配的一些证明
    P2764 最小路径覆盖问题(网络流24题之一)
    洛谷 P2055 [ZJOI2009]假期的宿舍
    P2891 [USACO07OPEN]吃饭Dining(最大流+拆点)
    洛谷P1345 [USACO5.4]奶牛的电信(最小割)
    网络流24题之星际转移问题(洛谷P2754)
    LeetCode Unique Binary Search Trees
  • 原文地址:https://www.cnblogs.com/gomysql/p/4595621.html
Copyright © 2020-2023  润新知