2016-10-30 6 views
2

Ich versuche, mehr IP-Adressen IPv4 und IPv6 von 86.120.51.222 bis 1450718174. Derzeit zu konvertieren versuchen, die Abfrage zu erstellen, weiß aber nicht viel SQLConvert IPv4- und IPv6-Adressen zu Integer

TABLE ip_city_country_location

+----+---------+---------------+-------------+ 
| ID | ip_from |  ip_to  | city  | 
+----+---------+---------------+-------------+ 
| 1 | 1.2.3.4 | 1.255.255.255 | city_name_1 | 
| 2 | 1.3.4.4 | 1.6.0.0  | city_name_2 | 
| 3. | 1.0.0.0 | 1.5.5.5  | city_name_3 | 
+----+---------+---------------+-------------+ 

Was ich denke an

UPDATE ip_city_country_location SET ip_from = INET_ATON(SELECT ip_from FROm ip_city_country_location), ip_to = INET_ATON(SELECT ip_to FROm ip_city_country_location); 

Hinweis kann auch mit CASE und WHEN uNDerfolgen, aber brauche eine andere eine Lösung, die automatisch konvertiert, weil dies ein dbs 5 Millionen Zeilen ist und es von Shell (Xampp) ausführen müssen. Erstellen Sie eine Funktion in SQL oder SMTP.

erwartete Ausgabe

+----+---------+---------------+-------------+ 
| ID | ip_from |  ip_to  | city  | 
+----+---------+---------------+-------------+ 
| 1 | 16909060 | 33554431  | city_name_1 | 
| 2 | 16974852 | 17170432  | city_name_2 | 
| 3. | 16777216 | 17106181  | city_name_3 | 
+----+---------+---------------+-------------+ 
+0

Warum Sie nicht wie dieses 'UPDATE ip_city_country_location SET verwenden ip_from = INET_ATON (ip_from), ip_to = INET_ATON (ip_to);'? – 1000111

Antwort

2

Die Abfrage Sie suchen, ist ziemlich einfach.

Hier ist die Abfrage:

UPDATE ip_city_country_location SET ip_from = INET_ATON(ip_from), ip_to = INET_ATON(ip_to); 

Hinweis:

  • Nachdem die ip_addresses zu integer Wert Umwandlung sollten Sie zu VARBINARY(16) den Datentyp ändern.
  • Index auf ip_from und ip_to Felder würden Ihre ausgewählten Abfragen beschleunigen.

EDIT:

Um IPV6 Adressen konvertieren Sie müssen MySQL Server-Version> = 5.6.3.

Und die Abfrage wie folgt aussehen würde:

UPDATE 
ip_city_country_location 
SET ip_from = IF(IS_IPV6(ip_from),INET6_ATON(ip_from), INET_ATON(ip_from)),   
    ip_to = IF(IS_IPV6(ip_to),INET6_ATON(ip_to), INET_ATON(ip_to)); 

Credit: Dank @ Michael für seinen wertvollen Beitrag hinzu.

Sie können nicht speichern das Äquivalent einer IPv6-Adresse in einer ganzen Zahl Spalte, wie IPv6-Adressen sind 128 Bits lang, während die längste ganze Zahl von MySQL unterstützt BIGINT nicht signiert ist, der nur 64 Bit beträgt. INET6_ATON() gibt VARBINARY (16) für IPv6-Adressen zurück.

+0

Was, wenn ich auch IPv6-Einträge habe, wird das auch für sie funktionieren? – user3467855

+0

Was ist die Version Ihres 'MySQL'? – 1000111

+0

Versucht es und es funktioniert für ipv4, aber für '2a0a: 2f07: ffff: f' werden sie ausgelöscht. Ich denke es ist 5.6.16. – user3467855