Maison  >  Article  >  base de données  >  Comment stocker efficacement les adresses IPv6 dans MySQL : DECIMAL(39,0) vs VARBINARY(16) ?

Comment stocker efficacement les adresses IPv6 dans MySQL : DECIMAL(39,0) vs VARBINARY(16) ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 05:36:30718parcourir

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

Stockage efficace des adresses IPv6 dans MySQL

Stocker efficacement les adresses IPv6 dans MySQL peut être un défi. Deux méthodes couramment utilisées incluent l'utilisation de deux champs BIGINT ou d'un champ DECIMAL(39,0).

Avantages et inconvénients de DECIMAL(39,0)

Utilisation de DECIMAL( 39,0) sur 2*BIGINT offre plusieurs avantages :

  • Taille compacte : Un champ DECIMAL(39,0) stocke l'adresse IPv6 sous la forme d'une valeur unique, ce qui est plus compact que d'utiliser deux champs BIGINT.
  • Requêtes plus rapides : Les requêtes sur un champ DECIMAL(39,0) sont généralement plus rapides que sur deux champs BIGINT, en particulier pour les requêtes par plage.

Cependant, DECIMAL(39,0) présente également certains inconvénients :

  • Limites de précision : DECIMAL(39,0) ne peut pas gérer les adresses IPv6 de plus de 39 chiffres .
  • Manque de standard : L'utilisation de DECIMAL(39,0) pour le stockage IPv6 n'est pas une approche standardisée et peut ne pas être prise en charge par toutes les versions de MySQL.

Conversion de binaire en décimal et vice versa

Pour convertir du format binaire renvoyé par inet_pton() vers un format de chaîne décimale utilisable par MySQL, vous pouvez utiliser le PHP suivant function :

<code class="php">function binaryToDecimal($binary) {
  $hex = bin2hex($binary);
  return gmp_strval(gmp_init($hex, 16), 10);
}</code>

Pour reconvertir une chaîne décimale en binaire, utilisez la fonction suivante :

<code class="php">function decimalToBinary($decimal) {
  $hex = gmp_strval(gmp_init($decimal), 16);
  return hex2bin($hex);
}</code>

Optimisation du stockage pour les adresses IPv6

Au lieu d'utiliser DECIMAL(39,0), une option plus efficace consiste à utiliser une colonne VARBINARY(16) et à exploiter les fonctions inet_pton() et inet_ntop() pour la conversion. Cette approche est prise en charge dans MySQL 5.6 et versions ultérieures et offre à la fois des avantages en termes de compacité et de performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn