さて、私は今、同様の質問がおそらく何百万回も聞かれていることを知っていますが、私はこれの真の初心者であり、ここであなたの助けに本当に感謝します。
基本的に、後で取得して検証できるように、訪問者のIPアドレスをMySQLに保存します。まず、IPアドレスを格納するために使用する必要のあるフィールドのタイプを知る必要があります。また、可能であれば、システムをIPv6アドレスと互換性を持たせたいと思います。
前もって感謝します
IPv4を保存するにはINT UNSIGNED
、を使用できますが、IPv6の場合decimal(39,0),
は、テーブルにIPを保存する必要があります。次の関数を使用できますINET_ATON
。
INSERT INTO table (ipcol) VALUES (INET_ATON('192.168.0.10'));
そして、関数でそれを取り戻しますINET_NTOA
:
SELECT INET_NTOA(ipcol) AS ip FROM table;
これは、MySQLIPv6サポートの前に存在していた答えです。ユーザーは、MySQLがIPv6をネイティブにサポートするようになったことを認識しておく必要があります: https ://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html
データ型にVARBINARY(16)を使用し、MySQL関数を使用しINET_ATON()
てIP番号を挿入します(後で逆関数を使用して読み取りますINET_NTOA()
。
MySQLには、IPv6アドレスを格納するのに十分な大きさの整数型はありません。それを保存する最もコンパクトな方法は、のようなものBINARY(16)
です。アドレスを保存および取得するだけで、それらに対して論理操作を実行する必要がない場合(たとえば、どのIPアドレスがカバープレフィックスの下にあるかを照会するネットマスク操作)、それで十分です。論理演算またはビット演算を実行する必要がある場合は、より巧妙である必要があります。IPv6アドレスを2つの別々の64ビット整数列に格納する必要があります。
あなたは正しいですが、MySQL 5.7では、IPV6を10進形式で保存することが可能です。また、ipv6から10進数に、またはその逆に変換することもできます。
MySQL 5.0 IPV4
select INET_ATON('192.168.0.1')
int値を返します:3232235521
MySQL 5.7 IPV6
select cast(conv(substr(HEX(INET6_ATON('0:0:0:0:0:FFFF:C0A8:0001')), 1, 16), 16, 10) as decimal(65))*18446744073709551616 +
cast(conv(substr(HEX(INET6_ATON('0:0:0:0:0:FFFF:C0A8:0001')), 17, 16), 16, 10) as decimal(65))
bigint値を返します:281473913978881
int(10)
署名なし