IP地址在数据库里面的存储方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 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个字节相差的数据量会让你吃惊。