Kollationen
Kollationen legen fest, wie Text in der Ausführungsmaschine sortiert oder verglichen werden soll. Sie sind für die Lokalisierung nützlich, weil die Regeln zur Textordnung je nach Sprache oder Land unterschiedlich sind. Diese Ordnungen sind oft miteinander unvereinbar. Im Englischen steht der Buchstabe y beispielsweise zwischen x und z. Im Litauischen steht y dagegen zwischen i und j. Deshalb werden verschiedene Kollationen unterstützt. Die Benutzerin bzw. der Benutzer muss wählen, welche Kollation bei Sortier- und Vergleichsoperationen verwendet werden soll.
Standardmäßig wird die Kollation BINARY verwendet. Das bedeutet, dass Zeichenketten ausschließlich anhand ihres Binärinhalts geordnet und verglichen werden. Das ist für Standard-ASCII-Zeichen sinnvoll (also die Buchstaben A–Z und die Ziffern 0–9), in der Regel aber nicht für besondere Unicode-Zeichen. Es ist jedoch mit Abstand die schnellste Methode für Ordnung und Vergleiche. Daher empfiehlt es sich, bei der Kollation BINARY zu bleiben, sofern nicht etwas anderes erforderlich ist.
Die Kollation
BINARYist auch unter den AliasenCundPOSIXverfügbar.
Warnung Die Kollationsunterstützung in DuckDB hat einige bekannte Einschränkungen und mehrere geplante Verbesserungen.
Kollationen verwenden
In der eigenständigen Installation von DuckDB sind drei Kollationen enthalten: NOCASE, NOACCENT und NFC. Die Kollation NOCASE vergleicht Zeichen unabhängig von ihrer Groß-/Kleinschreibung als gleich. Die Kollation NOACCENT vergleicht Zeichen unabhängig von ihren Akzenten als gleich. Die Kollation NFC führt NFC-normalisierte Vergleiche durch, siehe Unicode-Normalisierung für weitere Informationen.
SELECT 'hello' = 'hElLO';falseSELECT 'hello' COLLATE NOCASE = 'hElLO';trueSELECT 'hello' = 'hëllo';falseSELECT 'hello' COLLATE NOACCENT = 'hëllo';trueKollationen können mit dem Punktoperator verkettet werden. Beachten Sie jedoch, dass nicht alle Kollationen miteinander kombinierbar sind. Im Allgemeinen lässt sich die Kollation NOCASE mit jeder anderen Kollation kombinieren, die meisten anderen jedoch nicht.
SELECT 'hello' COLLATE NOCASE = 'hElLÖ';falseSELECT 'hello' COLLATE NOACCENT = 'hElLÖ';falseSELECT 'hello' COLLATE NOCASE.NOACCENT = 'hElLÖ';trueStandardkollationen
Die bisher gesehenen Kollationen wurden alle pro Ausdruck angegeben. Es ist auch möglich, eine Standardkollation festzulegen, entweder global auf Datenbankebene oder für eine Basistabellenspalte. Der PRAGMA default_collation legt die globale Standardkollation fest. Das ist die Kollation, die verwendet wird, wenn keine andere angegeben ist.
SET default_collation = NOCASE;SELECT 'hello' = 'HeLlo';trueKollationen können auch pro Spalte beim Anlegen einer Tabelle angegeben werden. Wenn diese Spalte dann in einem Vergleich verwendet wird, wird die spaltenbezogene Kollation für diesen Vergleich genutzt.
CREATE TABLE names (name VARCHAR COLLATE NOACCENT);INSERT INTO names VALUES ('hännes');SELECT nameFROM namesWHERE name = 'hannes';hännesSeien Sie hier jedoch vorsichtig, weil unterschiedliche Kollationen nicht kombiniert werden können. Das kann problematisch sein, wenn Sie Spalten vergleichen möchten, für die unterschiedliche Kollationen angegeben sind.
SELECT nameFROM namesWHERE name = 'hannes' COLLATE NOCASE;ERROR: Cannot combine types with different collation!CREATE TABLE other_names (name VARCHAR COLLATE NOCASE);INSERT INTO other_names VALUES ('HÄNNES');SELECT names.name AS name, other_names.name AS other_nameFROM names, other_namesWHERE names.name = other_names.name;ERROR: Cannot combine types with different collation!Wir müssen die Kollation manuell überschreiben:
SELECT names.name AS name, other_names.name AS other_nameFROM names, other_namesWHERE names.name COLLATE NOACCENT.NOCASE = other_names.name COLLATE NOACCENT.NOCASE;| name | other_name |
|---|---|
| hännes | HÄNNES |
ICU-Kollationen
Die bisher gesehenen Kollationen sind nicht regionsabhängig und folgen keinen spezifischen regionalen Regeln. Wenn Sie den Regeln einer bestimmten Region oder Sprache folgen möchten, müssen Sie eine der ICU-Kollationen verwenden. Dazu müssen Sie die ICU-Erweiterung laden.
Das Laden dieser Erweiterung fügt Ihrer Datenbank eine Reihe sprach- und regionsspezifischer Kollationen hinzu. Diese können Sie mit dem Befehl PRAGMA collations oder über die Funktion pragma_collations abfragen.
PRAGMA collations;SELECT list(collname) FROM pragma_collations();[af, am, ar, ar_sa, as, az, be, bg, bn, bo, br, bs, ca, ceb, chr, cs, cy, da, de, de_at, dsb, dz, ee, el, en, en_us, eo, es, et, fa, fa_af, ff, fi, fil, fo, fr, fr_ca, fy, ga, gl, gu, ha, haw, he, he_il, hi, hr, hsb, hu, hy, icu_noaccent, id, id_id, ig, is, it, ja, ka, kk, kl, km, kn, ko, kok, ku, ky, lb, lkt, ln, lo, lt, lv, mk, ml, mn, mr, ms, mt, my, nb, nb_no, ne, nfc, nl, nn, noaccent, nocase, om, or, pa, pa_in, pl, ps, pt, ro, ru, sa, se, si, sk, sl, smn, sq, sr, sr_ba, sr_me, sr_rs, sv, sw, ta, te, th, tk, to, tr, ug, uk, ur, uz, vi, wae, wo, xh, yi, yo, yue, yue_cn, zh, zh_cn, zh_hk, zh_mo, zh_sg, zh_tw, zu]Diese Kollationen können dann wie die zuvor verwendeten Kollationen eingesetzt werden. Sie lassen sich auch mit der Kollation NOCASE kombinieren. Um beispielsweise die deutschen Kollationsregeln zu verwenden, könnten Sie Folgendes tun:
CREATE TABLE strings (s VARCHAR COLLATE DE);INSERT INTO strings VALUES ('Gabel'), ('Göbel'), ('Goethe'), ('Goldmann'), ('Göthe'), ('Götz');SELECT * FROM strings ORDER BY s;"Gabel", "Göbel", "Goethe", "Goldmann", "Göthe", "Götz"