当前位置:Gxlcms > 数据库问题 > IP地址在数据库里面的存储方式

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

时间:2021-07-01 10:21:17 帮助过:11人阅读

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 t1\G
*************************** 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个字节相差的数据量会让你吃惊。

 


                              

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

标签:

人气教程排行