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個位元組相差的資料量會讓你吃驚。
原文:http://www.cnblogs.com/gomysql/p/4595621.html