Ich versuche, eine Benutzer-IP-Adresse mit Laravel 4 in meiner Datenbank zu speichern. Ich habe die folgende Funktion gefunden, die eine Zeichenfolge zurückgibt
%Vor%Wie würde ich das in meinem Modell speichern? Nur eine Zeichenfolge oder gibt es einen effizienteren Weg?
%Vor%Option 1: Verwenden Sie die Spalte VARCHAR (45)
Betrachten wir die Diskussion in einer anderen SO-Frage Maximale Länge der textuellen Darstellung einer IPv6-Adresse? , die maximale Länge von IPv6 ist 45, wenn die IPv4-Tunneling-Funktion enthalten ist.
Daher wäre ein sicherer Migrationsbefehl:
%Vor%Vorteile:
Nachteile:
Option 2: Verwenden Sie die BLOB-Spalte
Als @euantorano lieferte den Link zu IP-Adresse, die in der mysql-Datenbank gespeichert wird , können Sie die IP als Binärdatei speichern, um Speicherplatz zu sparen.
Die einfachste Antwort wäre:
%Vor%Vorteile:
Nachteile:
Sie müssen die IP-Adress-Zeichenfolge zuerst in binäre konvertieren, indem Sie etwas wie PHP verwenden inet_pton () . Die Spalte ist nicht direkt lesbar, da sie im Binärformat gespeichert ist. Sie werden merkwürdige Zeichen oder Leerzeichen sehen, wenn Sie versuchen, es direkt abzufragen. Sie können sich meinen Weg zum Speichern und Abrufen der IP-Adresse in Option 3 ansehen.
Der Abfrage-Generator in Laravel erstellt trotz der Methode, die binär heißt, eine BLOB-Spalte für dich. BLOB wird außerhalb der Tabelle gespeichert , aus dem Zeilenpuffer , wobei möglicherweise eine geringere Leistung bedeutet. Und es gibt wirklich keinen Grund, den BINARY-Spaltentyp nicht zu verwenden, da wir wissen, dass die IP-Adressen für BLOB nicht so lang sind.
Option 3: Verwenden Sie die Spalte VARBINARY (16)
Der Abfrage-Generator von Laravel erzeugt eine BLOB-Spalte für das Beispiel in Option 2. Wenn Sie MySQL verwenden, sollten Sie VARBINARY (16) anstelle von BLOB für eine bessere Leistung verwenden.
Migrationsskript:
%Vor%Offensichtlich ist der einzige wichtige Teil oben die DB :: -Anweisung (...). Wir müssen rohe Abfragen als Taylor Otwell vorschlagen . Fühlen Sie sich frei, den Rest des Tisches auf Ihre Art zu erstellen.
Von hier aus können Sie PHPs inet_pton () und inet_ntop () um die IP-Adress-Strings in binäre und umgekehrt umzuwandeln.
Vorteile:
Nachteile:
Zusätzliches Guthaben: Hinzufügen eines benutzerdefinierten Eloquent-Accessors / Mutators (optional):
Hier finde ich Eloquent wirklich nützlich. Sie können Ihren eigenen Accessor / Mutator auf Ihr Eloquent-Modell setzen und Sie können wie gewohnt über die Instanzvariable Ihres Modells abrufen / setzen.
%Vor%Wenn Sie das jetzt tun:
%Vor%Die IP-Adresse wird korrekt als Binärdatei gespeichert. Und Sie können tun:
%Vor%Und es wird 192.168.0.1 aussprechen. Sehr nützlich!
Von @Unnawut.
Sie müssen von binary(16)
zu varbinary(16)
wechseln, wenn Sie mit ipv4 und ipv6 im selben Feld arbeiten möchten.
Aber wenn du nur ip v4 behandeln musst, nur INT UNSIGNED
Wenn Sie nur ip v6 BINARY(16)
ref: MYSQL - Wählen Sie IP v4 / v6, inet_pton &Ampere; bin2hex
ref2: Ссылка