laravel 4 Speichern der IP-Adresse zum Modellieren

8

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%     
user391986 22.07.2013, 19:10
quelle

3 Antworten

36

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:

  1. Die Spalte ist für Menschen lesbar. Keine Konvertierung erforderlich, wenn der Wert festgelegt oder die Zeile zum Anzeigen abgefragt wird.

Nachteile:

  1. Es braucht mehr Platz als Option 2, fast dreimal so groß. Aber ich würde mir keine Sorgen machen, es sei denn, Sie planen Millionen von Zeilen.

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:

  1. Speichern Sie IP-Adressen in Binärdateien, um Speicherplatz zu sparen.

Nachteile:

  1. 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.

  2. 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:

  1. Spart Platz im Vergleich zu Option 1
  2. Bessere DB-Leistung im Vergleich zu Option 2

Nachteile:

  1. Wie Option 2 müssen Sie entweder manuell zwischen binärer und menschenlesbarer Zeichenfolge hin- und herwechseln oder das Eloquent-Modell mit einem Paar benutzerdefiniertem Accessor / Mutator verwenden, den ich im Folgenden demonstrieren werde.

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!

    
Unnawut 17.06.2014 18:23
quelle
1
%Vor%

Da die maximale Länge einer IPv6-Adresse 39 ist.

IPv4 wird unterstützt, da die Länge 15 nicht überschreitet.

    
yassine 27.02.2014 20:16
quelle
0

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)

behandeln wollen

ref: MYSQL - Wählen Sie IP v4 / v6, inet_pton &Ampere; bin2hex

ref2: Ссылка

    
Kanin Peanviriyakulkit 15.08.2014 04:28
quelle

Tags und Links