質問

うことにより店舗のIPv6アドレスはMySQL5.0ます。だったので、その他に関する質問、 このような.の著者から最終的に選んだのは二BIGINTます。私検索しても姿もしばしば使用メカニズム用DECIMAL(39,0)のIPv6アドレスです。私の質問についての質問です。

  1. そのメリットとデメリット使用数(39,0)、その他の方法など2*BIGINT?
  2. どんなに変換す(サポートに対するコミットメントバイナリ形式によって返される inet_pton() を小数文字列形式で利用されるようになってMySQL、どんなに変換帰りできますのでね-印刷inet_ntop()?
役に立ちましたか?

解決 2

ここで私は今からとDECIMAL(39.0)フォーマットにIPアドレスを変換するために使用する機能があります。これらは「への小数プレゼンテーション」と「進・ツー・プレゼンテーション」のinet_ptodとinet_dtop命名されています。これは、PHPでのIPv6とbcmathのサポートを必要とします。

/**
 * Convert an IP address from presentation to decimal(39,0) format suitable for storage in MySQL
 *
 * @param string $ip_address An IP address in IPv4, IPv6 or decimal notation
 * @return string The IP address in decimal notation
 */
function inet_ptod($ip_address)
{
    // IPv4 address
    if (strpos($ip_address, ':') === false && strpos($ip_address, '.') !== false) {
        $ip_address = '::' . $ip_address;
    }

    // IPv6 address
    if (strpos($ip_address, ':') !== false) {
        $network = inet_pton($ip_address);
        $parts = unpack('N*', $network);

        foreach ($parts as &$part) {
            if ($part < 0) {
                $part = bcadd((string) $part, '4294967296');
            }

            if (!is_string($part)) {
                $part = (string) $part;
            }
        }

        $decimal = $parts[4];
        $decimal = bcadd($decimal, bcmul($parts[3], '4294967296'));
        $decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616'));
        $decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336'));

        return $decimal;
    }

    // Decimal address
    return $ip_address;
}

/**
 * Convert an IP address from decimal format to presentation format
 *
 * @param string $decimal An IP address in IPv4, IPv6 or decimal notation
 * @return string The IP address in presentation format
 */
function inet_dtop($decimal)
{
    // IPv4 or IPv6 format
    if (strpos($decimal, ':') !== false || strpos($decimal, '.') !== false) {
        return $decimal;
    }

    // Decimal format
    $parts = array();
    $parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0);
    $decimal = bcsub($decimal, bcmul($parts[1], '79228162514264337593543950336'));
    $parts[2] = bcdiv($decimal, '18446744073709551616', 0);
    $decimal = bcsub($decimal, bcmul($parts[2], '18446744073709551616'));
    $parts[3] = bcdiv($decimal, '4294967296', 0);
    $decimal = bcsub($decimal, bcmul($parts[3], '4294967296'));
    $parts[4] = $decimal;

    foreach ($parts as &$part) {
        if (bccomp($part, '2147483647') == 1) {
            $part = bcsub($part, '4294967296');
        }

        $part = (int) $part;
    }

    $network = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]);
    $ip_address = inet_ntop($network);

    // Turn IPv6 to IPv4 if it's IPv4
    if (preg_match('/^::\d+.\d+.\d+.\d+$/', $ip_address)) {
        return substr($ip_address, 2);
    }

    return $ip_address;
}

他のヒント

私たちは、代わりにVARBINARY(16)列に行き、 inet_pton() inet_ntop() の変換を行うには:

https://github.com/skion/mysql-udf-ipv6する

の機能が実行されているMySQLサーバにロードすることができ、あなただけのIPv4のための身近なINET6_NTOPINET6_PTON機能として、SQLでINET_NTOAINET_ATON得られます。

編集:MySQLでの互換性のある機能だけのhref = "http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet6-aton" のrel = <で、今があります"nofollowをnoreferrer">異なるの名前がを。あなたは前の5.6 MySQLの上にあると便利な未来を探している場合にのみアップグレードパス上記を使用します。

DECIMAL(39)

メリット:

  • 作品との基本の算術演算子(+、-).
  • 作品は基本的な指数付けを(正確にはいられています。
  • 形式を表示します。

連結:

  • で範囲外の値がIPv6対応します。
  • ではない非常に効率的な蓄電メカニズム.
  • が混在しているので、ある数学演や機能を作るいいたします。

バイナリー(16)...

メリット:

  • 最も効率的な形式で正確に表現。
  • 作品は基本的な指数づけを正確に用いられています。
  • 作品とのprefixを割り出しのための接頭辞が8ビット単位.
  • 店舗のみ有効でIPv6値がない保証を有効に対応).
  • MySQLの以降のバージョンは機能を支える変換のためこのフォーマットからIPv6の表明ではない4in6).

連結:

  • なに優しい表示方向の変更を行います。
  • なに優ーティシペーションオペレーターまたは機能をたします。

バイナリ(39)...

これは完全なアドレスを使用hexdecも4in6).こともできアスキーよりもバイナリー.

メリット:

  • 人間が読める形式の場合はお電話のIPv6いします。
  • 対応の基本指数づけを正確に用いられています。
  • 支援のprefixを割り出しのための複数の4ビット.
  • 直接のIPv6対応です。無変換が必要です。

連結:

  • うまくいかないと数学の機能です。
  • 最も効率の悪い。
  • できあが無効な表現に変換するものである。

奇妙:

  • が複雑にしたい場合などに大文字と小文字を区別しません。
  • IPv6はその他の表示形式は利用者がより複雑になりましたので二の表現は同じアドレスまたは本体を万が一紛失してしまっ範囲ルックアップきもとで45バイトの長さはvarchar/varbinary.
  • の差異の支援の保存にアドレスとしてのものを受信します。ることが稀にご希望される場合で本体を万が一紛失してしまっく利益をもたらします。
  • 削除のセパレーターとフルフォーマットや店舗としての六角レンチ文字列の少ない手間となりまます。きのこの長い道のりばprefixを割り出しはが重要だということになります(バイナリ(128)).

BIGINT符号なし*2

メリット:

  • 作品の数理事業者及び機能について、問題点のどうしていくべきなのかについても周辺で二列あります。
  • 効率的なものとを条件としている二つの列の追加オーバーヘッド。
  • 作品の基本指標(正確には、用いられています。
  • 作品との接頭辞を指数が接頭辞は64ビット.
  • 表示に優します。

連結:

  • 二つの柱で非原子と手段が倍増の多い業務です。

奇妙:

  • 多くの現代語-現代システムに64ビットのint値が符号なし.署名は問題がある。負の数は現在のとして以下のものをビット列が実際に高い。このような理由からでは普通で使4*UNSIGNED INT.
  • 同様に人々折れる可能性があるというものprefixを割り出しにこだわって8ビット(符号なしBIT).一部の人がそうなった方もご利用いただけるビット(1)タイプのフルprefixを割り出しを想定し、MySQL株正ス指数ビットの種類。
  • 再び同様に四列の一部業務を必要とするようなものをからつくり、他のは皮肉なことに容易にたるみビット計算(中間値計算でき64ビット)とする。

概要

利用者が異なる形式とは異なる。下位互換であるのかに依存するには何が行われていたIPv4でその他により異なりのアドレスを使用して、optimisations頃ます。だが、一つ以上の方法を使っています。

B16はデフォルトのアプローチで最も効率的な、手間無料です。

変換PHPできない方の場合の研究:

  • gmpはbcmath
  • PHPの取り扱い、ビット単位で事業者は、特に意識の制限はintまたはfloatなどの機能に依存していることがないように有
  • におけるIPv6普及-高度化形式
  • パック開梱,bin2hex/hex2bin.

のものをお勧めしますただし共通の図書館を扱うIPv6の各種表示フォーマット

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top