可能性のある複製:
mySQLでIPを保存する方法
$_SERVER['REMOTE_ADDR']
およびいくつかの他の$_SERVER
変数からIPアドレスを取得したいのですが、これに適したデータ型はどれですか?
VARCHAR(n)
ですか?
IPv4アドレスは4バイト長なので、正確に4バイトの INT
(UNSIGNED
) を使用できます。
`ipv4` INT UNSIGNED
そして INET_ATON
と INET_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']);
次の2つの可能性があります(IPv4アドレスの場合)。
varchar(15)
192.128.0.15
たとえばinteger
(4バイト)3229614095
以前に使用したIP
2番目の解決策は、データベースのスペースが少なくて済むため、データを保存および取得するときに多少の操作が必要な場合(から/に変換する場合でも)文字列)。
これらの操作については、PHP側の ip2long()
および long2ip()
関数、または inet_aton()
および inet_ntoa()
MySQLサイド。
IPv4アドレスの場合、VARCHARを使用して文字列として保存できますが、長いインテグレーターINT(11) UNSIGNED
として保存することもできます。 MySQLのINET_ATON()
関数を使用して、整数表現に変換できます。これの利点は、BETWEEN
クエリのように、簡単に比較できることです。