Die gängigste Vorgehensweise besteht darin, den Suchbegriff und die Daten entweder in Klein- oder Großbuchstaben zu schreiben. Dabei gibt es jedoch zwei Probleme.
- Es funktioniert auf Englisch, aber nicht in allen Sprachen. (Vielleicht nicht einmal in meisten Sprachen.) Nicht jeder Kleinbuchstabe hat einen entsprechenden Großbuchstaben; nicht jeder Großbuchstabe hat einen entsprechenden Kleinbuchstaben.
- Wenn Sie Funktionen wie lower() und upper() verwenden, erhalten Sie eine sequenzielle Scan. Es können keine Indizes verwendet werden. Auf meinem Testsystem dauert die Verwendung von lower() etwa 2000 Mal länger als eine Abfrage, die einen Index verwenden kann. (Die Testdaten haben etwas mehr als 100k Zeilen.)
Es gibt mindestens drei weniger häufig verwendete Lösungen, die wirksamer sein könnten.
- Verwenden Sie die Zitext-Modul die das Verhalten eines Datentyps ohne Berücksichtigung der Groß- und Kleinschreibung weitgehend nachahmt. Nachdem Sie dieses Modul geladen haben, können Sie einen case-insensitive Index erstellen, indem Sie
CREATE INDEX ON groups (name::citext);
. (Aber siehe unten.)
- Verwenden Sie eine Sortierung, die Groß- und Kleinschreibung nicht berücksichtigt. Dies wird beim Initialisieren einer Datenbank. Die Verwendung einer Sortierung, die Groß- und Kleinschreibung nicht berücksichtigt, bedeutet, dass Sie Format vom Client-Code akzeptieren, und Sie geben trotzdem nützliche Ergebnisse. (Es bedeutet auch, dass Sie keine Abfragen unter Berücksichtigung der Groß-/Kleinschreibung durchführen können.)
- Erstellen Sie einen funktionalen Index. Erstellen Sie einen Index mit Kleinbuchstaben, indem Sie
CREATE INDEX ON groups (LOWER(name));
. Danach können Sie die Vorteile des Indexes mit Abfragen wie SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
o SELECT id FROM groups WHERE LOWER(name) = 'administrator';
Sie müssen erinnern Sie sich an LOWER() zu verwenden.
Das citext-Modul bietet keinen Datentyp, bei dem die Groß-/Kleinschreibung keine Rolle spielt. Stattdessen verhält es sich so, als ob jede Zeichenkette kleingeschrieben wäre. Das heißt, es verhält sich so, als hätten Sie den Befehl lower()
für jeden String, wie in Nummer 3 oben. Der Vorteil ist, dass die Programmierer nicht daran denken müssen, die Zeichenketten klein zu schreiben. Sie müssen jedoch die Abschnitte "String Comparison Behavior" und "Limitations" in den Dokumenten lesen, bevor Sie sich für die Verwendung von citext entscheiden.