回答:
文字列として保存しないでください。int unsigned
列を使用し、INET_ATON()
およびでINET_NTOA()
それぞれ保存/取得します。知る限り、mysqlはipv6のINET_ *をサポートしていません。
コメントごとに編集
組み込み関数を使用してIPを整数に変換したり、整数からIPに変換したり(したがって、これらの整数をデータベースに格納したり)すると、それらのIPが自動的に検証されるという副作用があります。IPをVARCHAR(16)として保存するとします。いくつかのカスタム検証では、無効なIP(例として999.999.999.999など)を保存しないようにする必要があります。INET_ *関数がそれを処理します。
おそらくIPv6の検討を開始する時期です。MySQLには、IPv6アドレスをバイナリ形式に変換する方法がありません。40文字の文字列は、通常のIPv6アドレスを処理します。40文字を超える可能性のある形式がありますが、実際には起こりそうにないものと考えます。
サイズから、7つの区切り文字で最大8つの4文字グループが存在するという情報からサイズを計算できます。異常な形式は、最後の2つのグループをIPv4形式のアドレスに置き換えます。アドレス圧縮なしで、最後の9文字を最大15文字に置き換えます。
ブロックを保存する場合、ブロックサイズの表示には、IPv4に必要な3文字ではなく4文字を使用できます。
取得するフォーマットが一貫していることを確認する必要がありますが、私が見たすべてのソフトウェアはアドレスに一貫したフォーマットを提供します。
PostgreSQLへの移行と、INETまたはCIDRデータ型の使用をお勧めします。
CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
test_id | address
---------+----------
1 | 1.2.3.4
2 | a:b::c:d
これは、MySQLメーリングリストの1つで作成された最良の回答です。読むIPアドレスを格納するためのベストFIELDTYPE ...。
簡単に言うと、2番目に、INT(10)UNSIGNEDを使用することをお勧めします。
したがって、192.168.10.50を使用する場合:
(192 * 2 ^ 24)+(168 * 2 ^ 16)+(10 * 2 ^ 8)+ 50 = 3232238130(結果は192.168.10.50)
MySQLでは、を直接使用
SELECT INET_ATON('192.168.10.50');
して取得でき3232238130
ます。
または
192 +(168 * 2 ^ 8)+(10 * 2 ^ 16)+(50 * 2 ^ 24)= 839559360(後方、結果は50.10.168.192)
MySQLでは、直接使用
SELECT INET_NTOA(3232238130);
して192.168.10.50
戻ること ができ ます。
MySQL v5.6.3の時点で、彼らはIPv4およびIPv6アドレスのサポートを追加しINET6_ATON
、INET6_NOTA
それがIPv4およびIPv6アドレスを処理します。しかし、彼らはもはや整数としてそれを保存しません。IPv6はvarbinary(16)
andを返し、IPv4はaを返しますvarbinary(4)
。
http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton
最大15文字まで保存できます。VARCHAR(15)は16バイトであるため、使用しないでください(最初のバイトは文字列の長さを管理するため、取得と保存が遅くなります)。IPアドレスなどの場合は常にCHAR(15)を使用します。