Antwort
 
Themen-Optionen
Alt 08.08.2007, 16:23 Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard [MySQL] Speichern einer IP-Adresse

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.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.08.2007, 17:12 Nach oben    #2
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 591
Standard

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.
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.08.2007, 20:40 Nach oben    #3
Neuer Benutzer
 
Registriert seit: 23.05.2006
Ort: Meerbusch
Beiträge: 15
Standard

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.
carrib ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.08.2007, 20:48 Nach oben    #4
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

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 ). Es soll aber sowohl mit IPv6 als auch mit IPv4 funktionieren :/
Angehängte Grafiken
Dateityp: png Bild 19.png (1,9 KB, 14x aufgerufen)
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.08.2007, 21:21 Nach oben    #5
Neuer Benutzer
 
Registriert seit: 23.05.2006
Ort: Meerbusch
Beiträge: 15
Standard

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;
Skript:
PHP-Code:
<?php

mysql_connect
('localhost''***''***');
mysql_select_db('***');

// IPv4
$addr '192.168.0.1';
$in_addr inet_pton($addr);
mysql_query("INSERT INTO ipaddr VALUES ('".$in_addr."')");
$res mysql_query("SELECT ipaddr FROM ipaddr WHERE ipaddr='".$in_addr."'");
$row mysql_fetch_array($res);
mysql_free_result($res);
echo 
"IPv4 aus DB: ".inet_ntop($row['ipaddr'])."\n";

// IPv6
$addr '2001:0db8:85a3:08d3:1319:8a2e:0370:7344';
$in_addr inet_pton($addr);
mysql_query("INSERT INTO ipaddr VALUES ('".$in_addr."')");
$res mysql_query("SELECT ipaddr FROM ipaddr WHERE ipaddr='".$in_addr."'");
$row mysql_fetch_array($res);
mysql_free_result($res);
echo 
"IPv6 aus DB: ".inet_ntop($row['ipaddr'])."\n";

mysql_close();

?>

// 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).
carrib ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.08.2007, 22:03 Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

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
//EDIT: Ich nutze übrigens überall (in MySQL) UTF-8... Liegt es daran?
//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).
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.08.2007, 00:27 Nach oben    #7
Neuer Benutzer
 
Registriert seit: 23.05.2006
Ort: Meerbusch
Beiträge: 15
Standard

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:
Ich nutze übrigens überall (in MySQL) UTF-8
Auch wenn ich für die Erstellung der Tabelle
Code:
CREATE TABLE `ipaddr` (
  `ipaddr` binary(16) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
verwende, funktioniert das Beispiel. Hast Du das Skript irgendwie modifiziert?

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";
durch
Code:
echo "IPv4 aus DB: ".inet_ntop(utf8_decode($row['ipaddr']))."\n";
ersetzen und sagen wie das Ergebnis ausschaut?
carrib ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 28.08.2007, 20:21 Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

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.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Impressumspflicht, Adresse angeben .. Ben Interessante Diskussionsthemen 15 11.10.2008 00:16
[Anmeldeseite]Firefox will Passwort speichern WarrenFaith HTML, XML und CSS 13 10.09.2007 11:54
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


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:38 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44