![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Erfahrener Benutzer
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 296
|
Ich möchte mit MySQL eine IP-Adresse speichern. Das ganze soll auch mit IPv6 funktionieren.
Ich rechne die Adresse mit inet_pton (PHP-Funktion - Converts a human readable IP address to its packed in_addr representation) um. Welcher Feldtyp soll ich da verwenden? Varchar? Und mit welcher Länge?
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 18.03.2005
Beiträge: 585
|
inet_pton kannte ich bis eben gar nicht (musste erstmal nachgucken).
Aber den Vorteil sehe ich dabei nicht so wirklich. Wenn ich IPs speichere, dann so, dass ich sie auch sortieren kann, wie soll das dann mit inet_pton gehen ? Die Länge wird wohl kleiner 15 sein. |
|
|
|
|
|
Nach oben #3 |
|
Neuer Benutzer
Registriert seit: 23.05.2006
Ort: Meerbusch
Beiträge: 15
|
Hi!
Die Größe einer IPv6 Adresse beträgt 128 bit, respektive umfasst die in_addr Struktur 16 Byte. Das lesbare Format umfasst 39 Byte inkl. Trennzeichen. Für die Speicherung der in_addr Repräsentation kannst Du demnach BINARY(16) verwenden. Für die Speicherung des lesbaren Formats CHAR(39). Da die Längen der beiden Repräsentationsformen fix sind benötigst Du keinen variablen Typ. |
|
|
|
|
|
Nach oben #4 |
|
Erfahrener Benutzer
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 296
|
Hm... Ich hab es mal mit BINARY(16) versucht. Gespeichert wird es so, wie es im Bild sichtbar ist.
Aber bei der Abfrage mit der genau gleichen IP wird nichts gefunden. Mit VARCHAR(255) funktioniert es. Das wird wohl aber kaum die Lösung sein //EDIT: Bei einer IPv6-Adresse funktioniert BINARY(16). Allerdings mit einer IPv4-Adresse nicht (darauf bezieht sich der obere Beitrag
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
|
|
|
|
|
Nach oben #5 |
|
Neuer Benutzer
Registriert seit: 23.05.2006
Ort: Meerbusch
Beiträge: 15
|
Hi,
folgender Test führte bei mir zum Erfolg: Tabelle: Code:
-- -- Tabellenstruktur für Tabelle `ipaddr` -- CREATE TABLE `ipaddr` ( `ipaddr` binary(16) NOT NULL default '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1; PHP-Code:
// Edit Ausgabe: Code:
IPv4 aus DB: 192.168.0.1 IPv6 aus DB: 2001:Db8:85a3:8d3:1319:8a2e:370:7344 Geändert von carrib (08.08.2007 um 21:24 Uhr). |
|
|
|
|
|
Nach oben #6 |
|
Erfahrener Benutzer
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 296
|
Und bei meiner DB:
Code:
Warning: inet_ntop() [function.inet-ntop]: Invalid in_addr value in /Users/blubb/Documents/workspace/test.php on line 4 IPv4 aus DB: IPv6 aus DB: 2001:Db8:85a3:8d3:1319:8a2e:370:7344 //EDIT2: Mit VARBINARY(16) funktioniert es auch :O Aber ist das eine saubere Lösung?
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. Geändert von Bleistift (08.08.2007 um 22:14 Uhr). |
|
|
|
|
|
Nach oben #7 | |
|
Neuer Benutzer
Registriert seit: 23.05.2006
Ort: Meerbusch
Beiträge: 15
|
Beim Typ BINARY wird der Wert nach rechts hin mit Nullbytes (0x00 bzw. \0) aufgefüllt bis die gewünschte Länge erreicht ist (in diesem Fall 16 Byte). Die Länge des Wertes wird hierbei nicht gespeichert. Diese Füllzeichen werden im Anschluss bei einer Abfrage/Auswahl mit zurückgegeben. Bei VARBINARY erfolgt keine Auffüllung des Wertes, jedoch werden je nach Länge des Wertes zusätzlich 1-2 Byte für die Speicherung der Wertlänge benötigt. Bei einem höheren Anteil an kürzeren IPv4 Adressen wäre VARBINARY sogar die bessere Wahl, da hierfür nur 5 (4 Byte Daten + 1 Byte Länge) statt 16 Byte pro Adresse verwendet werden.
Zitat:
Code:
CREATE TABLE `ipaddr` ( `ipaddr` binary(16) NOT NULL default '' ) ENGINE=MyISAM DEFAULT CHARSET=utf8; Wenn ich die in_addr manuell mittels utf8_encode() enkodiere tritt, wie zu erwarten, ein Fehler auf, aber ohne manuelle Manipulation nicht. Kannst Du in dem Beispiel bitte mal die Zeile Code:
echo "IPv4 aus DB: ".inet_ntop($row['ipaddr'])."\n"; Code:
echo "IPv4 aus DB: ".inet_ntop(utf8_decode($row['ipaddr']))."\n"; |
|
|
|
|
|
|
Nach oben #8 |
|
Erfahrener Benutzer
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 296
|
Sorry, das ich so lange nicht mehr geschrieben habe.
Die Veränderung der Zeile bewirkte übrigens nichts. Aber ist denn an VARBINARY(16) etwas auszusetzen?
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination. |
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Anmeldeseite]Firefox will Passwort speichern | WarrenFaith | HTML, XML und CSS | 13 | 10.09.2007 11:54 |
| Impressumspflicht, Adresse angeben .. | Ben | Plauderecke | 10 | 08.04.2007 17:46 |
| DAtensatz in Variable Speichern und in eine Tabbele speichern | kampfgnom | Datenbanken | 11 | 10.12.2006 20:45 |
| PDF in DB speichern oder ? | julien | Datenbanken | 9 | 14.05.2006 20:26 |
| Speichern von Einstellungen - Welche API? | pago | Allgemeine Java-Programmierung | 4 | 04.11.2005 20:25 |