11

さて、私は今、同様の質問がおそらく何百万回も聞かれていることを知っていますが、私はこれの真の初心者であり、ここであなたの助けに本当に感謝します。

基本的に、後で取得して検証できるように、訪問者のIPアドレスをMySQLに保存します。まず、IPアドレスを格納するために使用する必要のあるフィールドのタイプを知る必要があります。また、可能であれば、システムをIPv6アドレスと互換性を持たせたいと思います。

前もって感謝します

4

5 に答える 5

12

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

于 2012-05-14T19:42:51.283 に答える
6

データ型にVARBINARY(16)を使用し、MySQL関数を使用しINET_ATON()てIP番号を挿入します(後で逆関数を使用して読み取りますINET_NTOA()

于 2012-05-14T19:40:08.257 に答える
1

MySQLには、IPv6アドレスを格納するのに十分な大きさの整数型はありません。それを保存する最もコンパクトな方法は、のようなものBINARY(16)です。アドレスを保存および取得するだけで、それらに対して論理操作を実行する必要がない場合(たとえば、どのIPアドレスがカバープレフィックスの下にあるかを照会するネットマスク操作)、それで十分です。論理演算またはビット演算を実行する必要がある場合は、より巧妙である必要があります。IPv6アドレスを2つの別々の64ビット整数列に格納する必要があります。

于 2012-05-14T19:38:24.483 に答える
0

あなたは正しいですが、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

于 2019-12-24T11:42:14.147 に答える
-1

int(10)署名なし

http://lists.mysql.com/cluster/2781

于 2012-05-14T19:37:41.550 に答える