IPアドレスのデータベース内の格納方法

9914 ワード

ほとんどの会社のテーブル構造はDBAで審査する必要があります.IPアドレスを格納するにはvarchar(15)を採用することがあります.この方法は伝統的な方法で、15バイトを占有する必要がありますが、より省スペースな方法はありますか.あるに違いない.それはintで格納することだ.intストレージを採用すればここでは2つの処理方式がある.
1.MySQL関数で処理します.INET_を採用可能ATON,INET_NTOA関数を変換します.
2.開発言語の関数を用いて処理し、phpで例を挙げる.ip 2 long,long 2 ip関数を用いて変換できます.
上記の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のlong 2 ip()を使えばいいので、ここでは書きません.MySQLはこの値をフィールドに格納するにはint UNSIGNEDが必要です.UNSIGNEDを使わないと、128以上のIPセグメントが格納されません.もちろんbigintは使えますが、ケチられるにはケチをつけなければならないことを覚えておいてください.少し節約するのは少し、ははは.
PHP格納時:$ip=ip 2 long($ip);MySQLl取り出し時:SELECT INET_ATON(ip) FROM table ...PHPを取り出す時、一歩多い:$ip=long 2 ip($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バイトの差のデータ量に驚くことができます.