Memorizzazione di Indirizzi IPv6 in MySQL

Come è stato richiesto in “ipv6 inet_aton e inet_ntoa funzioni necessarie“, attualmente non c’è una funzione MySQL per la memorizzazione di indirizzi IPv6. Quale sarebbe il raccomandato tipo di dati/funzione per la memorizzazione, l’inserimento? (Non ho intenzione di tenerle come una stringa). Anche io non voglio per separare l’indirizzo IPv6 in 2 INT.

InformationsquelleAutor atx | 2011-08-06

 

3 Replies
  1. 83

    Come su:

    BINARY(16)

    Che dovrebbe essere abbastanza efficace.

    Attualmente non esiste una funzione per convertire testuale indirizzi IPv6 da/a codice binario server MySQL, come ha rilevato che il bug report. Si sia bisogno di fare nella vostra applicazione o, eventualmente, fare una UDF (User-Defined Function) in MySQL server per farlo.

    AGGIORNAMENTO:

    MySQL 5.6.3 ha il supporto per IPv6 indirizzi, vedere la seguente: “INET6_ATON(expr)“.

    Il tipo di dati è VARBINARY(16) invece di BINARY(16) come ho suggerito in precedenza. L’unica ragione per questo è che le funzioni di MySQL di lavoro per IPv6 e IPv4. BINARY(16) è bene per la memorizzazione solo gli indirizzi IPv6 e consente di risparmiare un byte. VARBINARY(16) deve essere utilizzato quando la gestione di entrambi i IPv6 e IPv4.

    Un’implementazione per le vecchie versioni di MySQL e MariaDB, vedere il seguente: “ESTENSIONE MYSQL 5 CON IPV6 FUNZIONI“.

    • Grazie per l’aggiornamento di questo!
    • Tempismo perfetto! Poco più di un mese dopo che ho postato la domanda 😛
  2. 8

    Nessuno ha postato una risposta (e un sacco di esempi di utilizzo di Windows ::1 che può essere molto fuorviante per vivere (o la “produzione”) ambienti di ogni dove (almeno che riesco a trovare) quindi, qui è:

    1. Il formato di archivio con.
    2. Esempio INSERT query utilizzando un ragionevolmente complesso IPv6 indirizzo IP.
    3. Esempio SELECT query che si sarà in grado di echo IPv6 indirizzo IP al client.
    4. Risoluzione dei problemi per garantire che non hai perso il codice legacy.

    Ho cambiato tutti i nomi di colonna per ipv6 a riflettere che essi correttamente supporto IPv6 (e che permette di mantenere la vecchia colonna ip intatto). È possibile memorizzare il ip colonna in ipv6 colonna e poi basta DROP il ip colonna, una volta che sei certo che la conversione ha lavorato; quando ho tempo aggiungo che a questo post.

    IPv6 Tipo Di Dati

    Come è stato detto VARBINARY 16 è auspicabile prima di AMD ci benedice con 128 bit Cpu e i database sono aggiornati per il supporto di 128 bit interi (ho detto bene?). IPv6 è di 128 bit e non a 64 bit.

    CREATE TABLE `example`
    (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `ipv6` VARBINARY(16) NOT NULL,
    PRIMARY KEY (`id`)
    )
    COLLATE='utf8mb4_unicode_520_ci'
    ENGINE=InnoDB;

    IPv6 Query di INSERIMENTO

    Abbiamo ovviamente bisogno di memorizzare un indirizzo IP IPv6, prima di poter SELECT; qui è il PHP /SQL codice:

    $ipv6 = mysqli_real_escape_string($db,'FE80:0000:0000:0000:0202:B3FF:FE1E:8329');
    $query1 = "INSERT INTO example (ipv6) VALUES (INET6_ATON('$ipv6'));";

    IPv6 Query di selezione

    Il PHP /SQL codice:

    $ipv6 = mysqli_real_escape_string($db,'FE80:0000:0000:0000:0202:B3FF:FE1E:8329');
    $query2 = "SELECT INET6_NTOA(ipv6) AS ipv6 FROM example WHERE ipv6=INET6_ATON('$ipv6');";

    Questo ritorno fe80::202:b3ff:fe1e:8329; no, non l’intero IPv6 (che è FE80:0000:0000:0000:0202:B3FF:FE1E:8329), è un condensato /versione abbreviata. C’è un codice per rendere formale full-length versione, ma questo è quello di salvare me stesso e gli altri in tempo perché questo Q/A è quello che continua a venire in su.

    Importante: solo perché alcuni indirizzi IPv6 look come si adatterebbe in bigint non non implica due minuti più tardi, qualcuno con una maggiore indirizzo IPv6 non fermarsi e devastare.

    Spero di salvare la gente dalla follia di aprire due dozzine di schede. Quando ho tempo in futuro sarò aggiungere il codice PHP che si estende condensato IPv6 per il completo formale formato.


    Risoluzione dei problemi

    Se per qualche motivo la memorizzazione e/o il recupero di indirizzi IPv6 non funziona per voi, quindi prendere da soli una copia di Avanzate Trovare e Sostituire (opere più veloce nel Vino di Linux nativo grep); utilizzare questo prevalentemente per la ricerca, non in sostituzione. Assicurarsi che il codice è coerente ovunque nel vostro software.

    • Tutti $ip variabili deve essere convertiti $ipv6 così sai che hai un po ‘ coperto.
    • Non dimenticate di rimuovere il finale ) per i prossimi quattro passaggi:
    • Di ricerca per tutte le istanze di PHP inet_pton( funzioni e rimuoverli.
    • Di ricerca per tutte le istanze di PHP inet_ntop( funzioni e rimuoverli.
    • Di ricerca per tutte le istanze di SQL INET_ATON( funzioni e rimuoverli.
    • Di ricerca per tutte le istanze di SQL INET_NTOA( funzioni e rimuoverli.
    • Di ricerca per tutte le istanze di $ipv6 e garantire che tutti gli IP-IN-A-SQL per le istanze di INET6_ATON('$ipv6') e che tutti i casi in cui IP-DA-SQL utilizzare INET6_NTOA(ipv6) AS ipv6.
    • Di ricerca per tutte le istanze di $row1['ip'] e sostituirli con $row1['ipv6'].
    • Garantire che tutte le istanze di $ipv6 = utilizzare il codice riportato di seguito (con un oggetto di database di riferimento è cambiato): $ipv6 = (isset($_SERVER['REMOTE_ADDR']) && strlen($_SERVER['REMOTE_ADDR']) > 0) ? mysqli_real_escape_string($db,$_SERVER['REMOTE_ADDR']) : mysqli_real_escape_string($db,getenv('REMOTE_ADDR'));.
    • Garantire che il vostro uso di prove appena testato indirizzi IP invece potenzialmente fallito versioni se siete a conoscenza che c’era qualcosa di sbagliato prima è iniziato il debug.
  3. 0

    Eccellente esempio io, però, ho notato quanto segue.
    Che funziona solo se la versione di mysql ha come funzione per INET6_ATON.
    Altrimenti il messaggio di errore potrebbe essere qualcosa del tipo: Che FUNCTION DOES NOT EXIST.

    • Si sono corrrect e la mia versione è molto vecchia e non ha questa capacità: (Ver 14.14 Distrib 5.1.41)

Lascia un commento