Detaillierte Erklärung, wie man IP-Adressen effektiv in MySQL speichert und wie man zwischen String-IP und numerischen Werten konvertiert

Detaillierte Erklärung, wie man IP-Adressen effektiv in MySQL speichert und wie man zwischen String-IP und numerischen Werten konvertiert

In Bezug auf High Performance MySQL Version 3 (Abschnitt 4.1.7) empfiehlt der Autor, beim Speichern von IPv4-Adressen vorzeichenlose 32-Bit-Ganzzahlen (UNSIGNED INT) anstelle von Zeichenfolgen zu verwenden. Es wurde jedoch kein konkreter Grund genannt. Um die Ursache herauszufinden, habe ich einige Informationen überprüft und aufgezeichnet.

Im Vergleich zur Zeichenfolgenspeicherung bietet die Verwendung vorzeichenloser Ganzzahlen zur Speicherung die folgenden Vorteile:

  • Sparen Sie Platz, sowohl Datenspeicherplatz als auch Indexspeicherplatz
  • Es ist bequem, Bereichsabfragen (BETWEEN...AND) zu verwenden und effizienter

Beim Speichern einer IPv4-Adresse muss diese normalerweise mindestens 7 und höchstens 15 Zeichen lang sein, daher kann VARCHAR(15) verwendet werden. Wenn MySQL eine Zeichenfolge mit variabler Länge speichert, ist ein zusätzliches Byte erforderlich, um die Länge der Zeichenfolge zu speichern. Wenn Sie zur Speicherung vorzeichenlose Ganzzahlen verwenden, werden nur 4 Bytes benötigt. Darüber hinaus können Sie 4 Felder verwenden, um jeden Teil von IPv4 separat zu speichern. Normalerweise sollte dies jedoch im Hinblick auf Speicherplatz und Abfrageeffizienz nicht zu viel sein (es kann einige Szenarien geben, in denen diese Speichermethode geeignet ist).

Eine ausführliche Leistungsanalyse und Benchmarks zur Verwendung von Zeichenfolgen und vorzeichenlosen Ganzzahlen zum Speichern von IP finden Sie in diesem Artikel.

Die Verwendung vorzeichenloser Ganzzahlen zur Speicherung hat auch Nachteile:

  • Nicht leicht zu lesen
  • Manuelle Konvertierung erforderlich

Zur Konvertierung stellt MySQL entsprechende Funktionen bereit, um IP im String-Format in den Integer INET_ATON und IP im Integer-Format in den String INET_NTOA umzuwandeln. Wie unten dargestellt:

 mysql> wähle inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
| 3232235521 |
+--------------------------+
1 Zeile im Satz (0,00 Sek.)
 
mysql> wähle inet_ntoa(3232235521);
+--------------------------+
| inet_ntoa(3232235521) |
+--------------------------+
| 192.168.0.1 |
+--------------------------+
1 Zeile im Satz (0,00 Sek.)

Für IPv6 können die gleichen Vorteile durch die Verwendung von VARBINARY erzielt werden, und MySQL bietet auch entsprechende Konvertierungsfunktionen, nämlich INET6_ATON und INET6_NTOA.
Um Zeichenfolgen-IPv4 und numerische Typen zu konvertieren, können Sie es in die Anwendungsschicht einfügen. Im Folgenden finden Sie den Java-Code zum Konvertieren der beiden:

 Paket com.mikan;
 
/**
 * @Autor Mikan
 * @date 22.09.2015 10:59
 */
öffentliche Klasse IpLongUtils {
    /**
     * Konvertieren Sie die Zeichenfolge IP in lang
     *
     * @param ipStr Zeichenfolge IP
     * @return der lange Wert, der der IP entspricht*/
    öffentliche statische lange ip2Long(String ipStr) {
        String[] ip = ipStr.split("\\.");
        Rückgabewert (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16)
                + (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]);
    }
 
    /**
     * Konvertieren Sie den langen IP-Wert in eine Zeichenfolge*
     * @param ipLong Langer Wert der IP* @return der String, der dem langen Wert entspricht*/
    öffentliche statische Zeichenfolge long2Ip(long ipLong) {
        StringBuilder ip = neuer StringBuilder();
        ip.append(ipLong >>> 24).append(".");
        ip.append((ipLong >>> 16) & 0xFF).append(".");
        ip.append((ipLong >>> 8) & 0xFF).append(".");
        ip.append(ipLong & 0xFF);
        gibt ip.toString() zurück;
    }
 
    öffentliche statische void main(String[] args) {
        System.out.println(ip2Long("192.168.0.1"));
        System.out.println(long2Ip(3232235521L));
        System.out.println(ip2Long("10.0.0.1"));
    }
    
}

Die Ausgabe ist:
3232235521
192.168.0.1
167772161

Damit ist dieser Artikel zum effektiven Speichern von IP-Adressen in MySQL und zur Konvertierung zwischen Zeichenfolgen-IPs und numerischen Werten abgeschlossen. Weitere Informationen zum effektiven Speichern von IP-Adressen in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Wir hoffen, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • So speichern Sie IP-Adressen in MySQL
  • So verwenden Sie die MySQL-Funktionen inet_aton() und inet_ntoa() zum Speichern von IP-Adressen

<<:  Detaillierte Erläuterung der Verwendung des gcc-Befehls unter Linux

>>:  CSS3-Mauszeiger-Übergangszoomeffekt

Artikel empfehlen

Detaillierte Schritte zum Ändern gespeicherter MySQL-Prozeduren

Vorwort Bei der tatsächlichen Entwicklung werden ...

HTML erstellt eine einfache und schöne Anmeldeseite

Schauen wir uns das zunächst einmal an. HTML Quel...

So bedienen Sie das Kontrollkästchen auf einer HTML-Seite

Kontrollkästchen sind auf Webseiten sehr verbreit...

Der MySQL-Server wird mit der Option --skip-grant-tables ausgeführt.

Der MySQL-Server läuft mit der Option --skip-gran...

4 Möglichkeiten, doppeltes Einfügen von Daten in Mysql zu vermeiden

Die gebräuchlichste Methode besteht darin, einen ...

Beschreiben Sie kurz die MySQL InnoDB-Speicher-Engine

Vorwort: Die Speicher-Engine ist der Kern der Dat...

MySQL implementiert den Vorgang zum Festlegen mehrerer Primärschlüssel

Benutzertabelle, ID-Nummer muss eindeutig sein, M...