IP処理関数inet_aton()とinet_ntoa()使用説明

4333 ワード

MYSqlのIP対intの変換関数
select inet_aton(ip) from table_name;
ネットワークアドレス:
192.168.33.123
各値は最大255、つまり16進数のFFを越えず、2つのByteが表す最大値は255です.
これで32ビットの整形でこのアドレスを保存できます
192 168 33 123
1100 0000 1010 1000 0010 0001 0111 1011
これらのバイナリを合わせると32ビットの数になります
11000000101010000010000101111011
10進数
3232244091
* INET_ATON(expr)
文字列であるネットワークアドレスの「ポイントアドレス」(127.0.0.1など)は、アドレスの数値を表す整数を返します.アドレスは4ビットまたは8ビットのアドレスであってもよい.
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480
生成された数字は常にネットワークバイト順です.上記の例のように、数字は209×2^24 + 207×2^16 + 224×2^8+40で計算します.
INET_ATON()もショートフォーマットIPアドレスを理解できる:
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
-> 2130706433, 2130706433
注記:INET_で保存ATON()で生成された値の場合は、INT UNSIGNED列を使用することをお勧めします.(符号付き)INT列を使用する場合、対応する最初の8ビットグループが127より大きいIPアドレス値は、2147483647(すなわち、INET_ATON('127.255.255.255.255.255')までに返される値)になります.11.2節、「数値タイプ」を参照してください.
* INET_NTOA(expr)
デジタルネットワークアドレス(4または8ビット)が与えられ、文字列であるアドレスの電気アドレス表現が返される.
mysql> SELECT INET_NTOA(3520061480);
-> '209.207.224.40'
プロジェクトでは、この2つの関数を知らないので、IPの処理はすべて自分で書いた関数ですが、使用時の効率は非常に悪く、次の関数はIPを整数に変換します.
 
  
CREATE FUNCTION `transIPtoInt`(ip char(31)) RETURNS char(31)
begin
DECLARE value1 CHAR(10);
DECLARE value2 CHAR(10);
DECLARE value3 CHAR(10);
DECLARE value4 CHAR(10);
set value1=SUBSTRING_INDEX(ip, '.', 1);
set value2=SUBSTRING_INDEX(ip, '.', 2);
set value2=SUBSTRING_INDEX(value2, '.', -1);
set value3=SUBSTRING_INDEX(ip, '.', -2);
set value3=SUBSTRING_INDEX(value3, '.', 1);
set value4=SUBSTRING_INDEX(ip, '.', -1);
set value1=value1<<24;
set value2=value2<<16;
set value3=value3<<8;
return value1+value2+value3+value4;
end;

IPアドレスの比較的便利さのために、私はまた1つのIPアドレスの中の1段ごとにすべて3位の関数を補充することを書いて、以下の通りです:
 
  
CREATE FUNCTION `fillIp`(ip char(31)) RETURNS char(31)
begin
DECLARE value1 CHAR(31);
DECLARE value2 CHAR(10);
DECLARE value3 CHAR(10);
DECLARE value4 CHAR(10);
set value1=SUBSTRING_INDEX(ip, '.', 1);
set value2=SUBSTRING_INDEX(ip, '.', 2);
set value2=SUBSTRING_INDEX(value2, '.', -1);
set value3=SUBSTRING_INDEX(ip, '.', -2);
set value3=SUBSTRING_INDEX(value3, '.', 1);
set value4=SUBSTRING_INDEX(ip, '.', -1);
set value1=LPAD(value1,3,'0');
set value2=LPAD(value2,3,'0');
set value3=LPAD(value3,3,'0');
set value4=LPAD(value4,3,'0');
return CONCAT(value1,'.',value2,'.',value3,'.',value4);
end;

以下は補足*INET_ですATON(expr)
文字列であるネットワークアドレスの「ポイントアドレス」(127.0.0.1など)は、アドレスの数値を表す整数を返します.アドレスは4ビットまたは8ビットのアドレスであってもよい.
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480
生成された数字は常にネットワークバイト順です.上記の例のように、数字は209×2563 + 207×2562 + 224×256+40で計算します.
INET_ATON()もショートフォーマットIPアドレスを理解できる:
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
-> 2130706433, 2130706433
注記:INET_で保存ATON()で生成された値の場合は、INT UNSIGNED列を使用することをお勧めします.(符号付き)INT列を使用する場合、対応する最初の8ビットグループが127より大きいIPアドレス値は、2147483647(すなわち、INET_ATON('127.255.255.255.255.255')までに返される値)になります.MySQLドキュメントの「数値タイプ」を参照してください.
* INET_NTOA(expr)
デジタルネットワークアドレス(4または8ビット)が与えられ、文字列であるアドレスの電気アドレス表現が返される.
*
mysql> SELECT INET_NTOA(3520061480);
-> '209.207.224.40'
--------------------------------------------------------------------------------------------------
整数フィールドの比較は文字列よりも効率が高く、最適化の原則にも合致します.フィールドタイプ定義は最適(最小)、最も簡単なデータ型を使用します.
inet_aton()アルゴリズムは,国際的に各国のIPアドレスの区別に用いられるip numberを借りている.
a.b.c.dのip numberは:
a*256の3次+b*256の2次+c*256の1次+d*256の0次.
--------------------------------------------------------------------------------------------------
mysqlの組み込み関数によるタイムスタンプ問題の処理
eg : select FROM_UNIXTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x');
結果:2004 3 rd August 03:35:48 2004