web-dev-qa-db-ja.com

IPアドレスに使用するMySQLデータ型はどれですか?

可能性のある複製:
mySQLでIPを保存する方法

$_SERVER['REMOTE_ADDR']およびいくつかの他の$_SERVER変数からIPアドレスを取得したいのですが、これに適したデータ型はどれですか?

VARCHAR(n)ですか?

91
ComFreek

IPv4アドレスは4バイト長なので、正確に4バイトの INTUNSIGNED を使用できます。

`ipv4` INT UNSIGNED

そして INET_ATONINET_NTOA はそれらを変換します:

INSERT INTO `table` (`ipv4`) VALUES (INET_ATON("127.0.0.1"));
SELECT INET_NTOA(`ipv4`) FROM `table`;

IPv6アドレスの場合、代わりに BINARY を使用できます。

`ipv6` BINARY(16)

変換には PHPのinet_pton および inet_ntop を使用します。

'INSERT INTO `table` (`ipv6`) VALUES ("'.mysqli_real_escape_string(inet_pton('2001:4860:a005::68')).'")'
'SELECT `ipv6` FROM `table`'
$ipv6 = inet_pton($row['ipv6']);
136
Gumbo

次の2つの可能性があります(IPv4アドレスの場合)。

  • iPアドレスを文字列として保存する場合は、varchar(15)
    • 192.128.0.15たとえば
  • iPアドレスを整数に変換する場合、integer(4バイト)
    • 3229614095以前に使用したIP


2番目の解決策は、データベースのスペースが少なくて済むため、データを保存および取得するときに多少の操作が必要な場合(から/に変換する場合でも)文字列)

これらの操作については、PHP側の ip2long() および long2ip() 関数、または inet_aton() および inet_ntoa() MySQLサイド。

46
Pascal MARTIN

IPv4アドレスの場合、VARCHARを使用して文字列として保存できますが、長いインテグレーターINT(11) UNSIGNEDとして保存することもできます。 MySQLのINET_ATON()関数を使用して、整数表現に変換できます。これの利点は、BETWEENクエリのように、簡単に比較できることです。

INET_ATON()MySQL関数

5