ホームページ > データベース > mysql チュートリアル > MySQL に IPv6 アドレスを効率的に保存する方法: DECIMAL(39,0) と VARBINARY(16)?

MySQL に IPv6 アドレスを効率的に保存する方法: DECIMAL(39,0) と VARBINARY(16)?

Mary-Kate Olsen
リリース: 2024-10-29 05:36:30
オリジナル
753 人が閲覧しました

  How to Efficiently Store IPv6 Addresses in MySQL: DECIMAL(39,0) vs. VARBINARY(16)?

MySQL での IPv6 アドレスの効率的な保存

MySQL で IPv6 アドレスを効率的に保存するのは難しい場合があります。一般的に使用される 2 つの方法には、2 つの BIGINT フィールドまたは DECIMAL(39,0) フィールドの使用が含まれます。

DECIMAL(39,0) の利点と欠点

DECIMAL( 2*BIGINT よりも 39,0) には、いくつかの利点があります。

  • コンパクト サイズ: DECIMAL(39,0) フィールドは、IPv6 アドレスを単一の値として格納します。 2 つの BIGINT フィールドを使用するよりもコンパクトです。
  • 高速なクエリ: DECIMAL(39,0) フィールドのクエリは、一般に、特に範囲クエリの場合、2 つの BIGINT フィールドよりも高速です。

ただし、DECIMAL(39,0) にはいくつかの欠点もあります。

  • 精度の制限: DECIMAL(39,0) は 39 桁を超える IPv6 アドレスを処理できません。 .
  • 標準の欠如: IPv6 ストレージでの DECIMAL(39,0) の使用は標準化されたアプローチではないため、すべての MySQL バージョンでサポートされているわけではありません。

バイナリから 10 進数への変換、およびその逆

inet_pton() によって返されたバイナリ形式から MySQL で使用できる 10 進数の文字列形式に変換するには、次の PHP を使用できます。 function:

<code class="php">function binaryToDecimal($binary) {
  $hex = bin2hex($binary);
  return gmp_strval(gmp_init($hex, 16), 10);
}</code>
ログイン後にコピー

10 進数文字列からバイナリ文字列に逆変換するには、次の関数を使用します:

<code class="php">function decimalToBinary($decimal) {
  $hex = gmp_strval(gmp_init($decimal), 16);
  return hex2bin($hex);
}</code>
ログイン後にコピー

IPv6 アドレスのストレージの最適化

DECIMAL(39,0) を使用する代わりに、より効率的なオプションは、VARBINARY(16) 列を使用し、inet_pton() 関数と inet_ntop() 関数を変換に利用することです。このアプローチは MySQL 5.6 以降でサポートされており、コンパクトさとパフォーマンスの両方の利点を提供します。

以上がMySQL に IPv6 アドレスを効率的に保存する方法: DECIMAL(39,0) と VARBINARY(16)?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート