Ein Projekt wird realisiert und dabei wird eines viel zu oft vergessen: Die richtige Handhabung der E-Mailadressen. Üblicherweise erstellt der Initiator des Projektes eine Tabelle mit der Spalte “mail”, setzt sie auf unique und gibt sich damit zufrieden. Doch aufgepasst: Je nach Einstellungen des Datenbanksystems oder der Verbindung ist die unique-Spalte case-sensitive. Das bedeutet sie unterscheidet zwischen Gross- und Kleinschreibung. Dann wird es möglich, sich mit ein- und derselben E-Mailadresse mehrmals zu registrieren. Zum Beispiel:
“user@example.com” und “User@example.com”
Ausserdem entfernen die meisten MTAs überschüssige Leerzeichen am Anfang und am Ende der E-Mailadresse. MTAs (Mail Transfer Agent) sind Programme, die nach dem Aufruf von mail() eine E-Mail im Hintergrund versenden. Ein Beispiel für diesen Fehler:
“user@example.com” und ” user@example.com”
Für die Datenbank sind das nicht die gleichen Strings – für manche MTAs schon. Daraus ergibt sich, vorallem in Kombination beider Fehler, eine imense Anzahl an Möglichkeiten sich mit der gleichen E-Mailadresse zu registrieren.
Nun gibt es grundsätzlich 2 Varianten dem entgegenzutreten. Die erste wäre folgende Funktion:
function address($mail) { $revised = strtolower(trim($mail)); return $revised; }
Bei diesem (durch PHP gesicherten) Beispiel muss einfach sichergestellt werden, dass die Funktion überall dort Verwendung findet wo eine E-Mailadresse entgegengenommen wird. Das zweite Beispiel wäre ein sogenannter “functional index” im DBS. Das sind Indizes die einer gewissen Regel (Funktion) obliegen:
CREATE UNIQUE INDEX name_vom_index ON tabelle(lower(trim(spalte)));
Ich bin mir nicht sicher ob MySQL letzteres unterstützt. PostgreSQL tut es zumindest.
Eine Antwort für "Aufgepasst: E-Mail"
CREATE INDEX ist kein SQL Standard. Um das ganze zu lösen wenn die DB keine funktionsbasierten indices unterstützt, legt man eine zweite Spalte an, in der der lower oder upper Wert des zu prüfenden Wertes eingetragen wird. Auf diese technische Spalte wird der Uniqueconstraint gelegt.
Wenn es nicht wichtig ist die Gross-/Kleinschreibung zu erhalten, (bei Emailadressen ist es das z.B. nicht) kann ich mir die zweite Spalte auch sparen und speichere den Wert generell mit Klein/- oder Grossbuchstaben ab.
Kommentar verfassen