1. 程式人生 > >IP地址在資料庫裡面的儲存方式

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