Option 1: Mit VARCHAR (45) Spalte
Betrachten wir die Diskussion in einer anderen SO Frage Maximum length of the textual representation of an IPv6 address?, die Maxime Die Länge von IPv6 beträgt 45, wenn die IPv4-Tunnelfunktion einbezogen wird.
Somit ist ein sicherer Migrationsbefehl wäre:
$table->string('ip_address', 45);
Pro:
- Die Säule ist in lesbarer Form. Keine Konvertierung erforderlich, wenn der Wert festgelegt oder die Zeile zum Anzeigen abgefragt wird.
Nachteile:
- Es nutzt mehr Platz als Option 2, fast 3-mal größer ist in der Tat. Aber ich würde mir keine Sorgen machen, es sei denn, Sie planen Millionen von Zeilen.
Option 2: Verwenden Sie BLOB-Spalte
Wie @euantorano den Link zu IP address storing in mysql database zur Verfügung gestellt, die IP als binäre speichern kann, um Platz zu sparen.
Die einfachste Antwort wäre zu verwenden:
$table->binary('ip_address');
Vorteile:
- Shop IP-Adressen in binärer werden Sie etwas Platz sparen.
Nachteile:
Sie müssen die IP-Adresse Zeichenfolge konvertieren inet_pton() zunächst mit so etwas wie PHP binär. 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.Vielleicht möchten Sie meinen Weg zum Speichern und Abrufen der IP-Adresse in Option 3 unten sehen.
Der Abfrage-Generator in Laravel, trotz der Methode, die als binär bezeichnet wird, wird tatsächlich create a BLOB column für Sie. BLOB is stored off the table, out of the row buffer, die möglicherweise bedeutet eine geringere Leistung. Und es gibt wirklich keinen Grund, den BINARY-Spaltentyp nicht zu verwenden, da wir wissen, dass IP-Adressen nicht so lang sind, dass BLOB notwendig ist.
Option 3: Verwenden Sie VARBINARY (16) Spalte
Laravel der Query Builder eine BLOB-Spalte für das Beispiel in Option erzeugt 2. Wenn Sie MySQL verwenden, werden Sie verwenden möchten VARBINARY (16) anstelle von BLOB für bessere Leistung.
Migration Skript:
class CreateMyLogsTable extends Migration {
public function up()
{
Schema::create('my_logs', function(Blueprint $table) {
$table->increments('id');
});
DB::statement('ALTER TABLE `my_logs` ADD `ip_address` VARBINARY(16)');
}
public function down()
{
DB::statement('ALTER TABLE `my_logs` DROP COLUMN `ip_address`');
Schema::drop('my_logs');
}
}
Offensichtlich ist die einzige oberhalb wichtiger Teil ist die DB :: Aussage (...). Wir müssen rohe Abfragen als Taylor Otwell suggested verwenden. Fühlen Sie sich frei, den Rest des Tisches auf Ihre Art zu erschaffen.
Von hier aus können Sie die inet_pton() und inet_ntop() PHP verwenden, um die IP-Adressfolgen in binäre und umgekehrt umzuwandeln.
Vorteile:
- Raum spart im Vergleich zu Option 1
- Leistung besser DB im Vergleich zu Option 2
Nachteile:
- Wie Option 2, Sie müssen entweder manuell y wandeln Sie zwischen binärer und menschenlesbarer Zeichenkette hin und her oder verwenden Sie das Eloquent-Modell mit einem Paar benutzerdefiniertem Accessor/Mutator, den ich unten zeigen werde.
Extra-Kredit: Fügen Sie benutzerdefinierte Eloquent Accessor/Mutator (optional):
Hier ist, wo ich Eloquent wirklich nützlich finden. Sie können Ihren eigenen Accessor/Mutator auf Ihr Eloquent-Modell einstellen und Sie können wie gewohnt über die Instanzvariable Ihres Modells abrufen/setzen.
class MyLog extends Eloquent {
public $timestamps = false;
public function getIpAddressAttribute($value)
{
return inet_ntop($value);
}
public function setIpAddressAttribute($value)
{
$this->attributes['ip_address'] = inet_pton($value);
}
}
Nun, wenn Sie tun:
$log = new MyLog;
$log->ip_address = '192.168.0.1';
$log->save();
Die IP-Adresse wird korrekt als binär gespeichert werden. Und Sie können:
$log = MyLog::find(1);
echo $log->ip_address;
Und es wird 192.168.0.1. Sehr hilfreich!
Werfen Sie einen Blick auf diese relevante Frage: http://stackoverflow.com/questions/6427786/ip-address-storing-in-mysql-database – euantorano
danke! Ich habe über VARBINARY nachgedacht, aber ich kann diesen Typ im Schema-Builder nicht finden, ist es dasselbe wie $ table-> binary ('data'); ? http://four.laravel.com/docs/schema – user391986
Sieht aus, als wäre es nur eine binäre Spalte statt VARBINARY: http://laravel.com/api/source-class-Illuminate.Database.Schema.Bluprint.html#576 -585 - könnte eine gute Idee sein, es zu testen und zu sehen. – euantorano