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

So verwenden Sie vue3+TypeScript+vue-router

Inhaltsverzeichnis Einfach zu bedienen Erstellen ...

So installieren Sie Jenkins mit Docker

Inhaltsverzeichnis 1. Ziehen Sie das Bild 2. Erst...

MySQL-Abfrage gibt an, dass das Feld keine Zahl und kein Komma SQL ist

Grundlegende SQL-Anweisungen MySQL-Abfrageanweisu...

Vue echarts realisiert die dynamische Anzeige von Balkendiagrammen

In diesem Artikel wird der spezifische Code von V...

Einige Vorschläge zur Gewährleistung der MySQL-Datensicherheit

Daten sind das wichtigste Kapital eines Unternehm...

Detaillierte Erklärung, wie Zabbix den Master-Slave-Status von MySQL überwacht

Nach dem Einrichten des MySQL-Master-Slaves wisse...

So aktivieren Sie den Fernzugriff in Docker

Docker-Daemon-Socket Der Docker-Daemon kann über ...

SQL-Gruppierung zum Entfernen von Duplikaten und Sortieren nach anderen Feldern

brauchen: Identische Elemente eines Feldes zusamm...

Kann Asynchronität in JavaScript „Await“ speichern?

Ich wusste vorher, dass man await verwenden muss,...

Zusammenfassung der Verwendung von Element-Formularelementen

Es gibt viele Formularelemente. Hier ist eine kur...

Ein kurzer Vortrag über die halbsynchrone MySQL-Replikation

Einführung MySQL erreicht eine hohe Verfügbarkeit...

Dateiupload über HTML5 auf Mobilgeräten

Meistens werden Plug-Ins zum Hochladen von Dateie...

Zwei Tools zum Teilen des Bildschirms im Linux-Befehlszeilenterminal

Hier sind zwei Terminal-Split-Screen-Tools: scree...