大多數公司的表結構都需要經過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個字節相差的數據量會讓你吃驚。