Bei der überwiegenden Mehrheit der Anweisungen ist
offensichtlich, welche Sortierfolge MySQL zur Auflösung einer
Vergleichsoperation verwendet. Beispielsweise sollte es in den
folgenden Fällen klar sein, dass die Sortierfolge der Spalte
x
verwendet wird:
SELECT x FROM T ORDER BY x; SELECT x FROM T WHERE x = x; SELECT DISTINCT x FROM T;
Wenn allerdings mehrere Operanden vorhanden sind, kann es zu Mehrdeutigkeiten kommen. Zum Beispiel:
SELECT x FROM T WHERE x = 'Y';
Soll diese Abfrage die Sortierfolge der Spalte
x
oder die des String-Literals
'Y'
verwenden?
Der SQL-Standard löst solche Fragen mithilfe so genannter
„Sortierfolgevorrangsregeln“. Im Grunde genommen
bedeutet dies: Sowohl x
als auch
'Y'
haben Sortierfolgen – welche
Sortierfolge also hat Vorrang? Dies kann schwierig zu lösen
sein, aber die folgenden Regeln sollten die meisten Situationen
abdecken:
Eine explizite COLLATE
-Klausel hat einen
Sortierfolgenvorrangswert von 0 (d. h. gar keinen Vorrang).
Die Verkettung zweier Strings mit verschiedenen Sortierfolgen hat einen Sortierfolgenvorrangswert von 1.
Die Verkettung einer Spalte, eines Parameters einer gespeicherten Routine oder einer lokalen Variablen hat einen Sortierfolgenvorrangswert von 2.
Eine „Systemkonstante“ (d. h. der von
Funktionen wie USER()
oder
VERSION()
zurückgegebene String) hat
einen Sortierfolgenvorrangswert von 3.
Die Sortierfolge eines Literals hat einen Sortierfolgenvorrangswert von 4
NULL
oder ein Ausdruck, der von
NULL
abgeleitet ist, hat einen
Sortierfolgenvorrangswert von 5.
Die genannten Sortierfolgenvorrangswerte gelten für MySQL 5.1.
Diese Regeln lösen Mehrdeutigkeiten wie folgt auf:
Die Sortierfolge mit dem niedrigsten Sortierfolgenvorrangswert wird verwendet.
Weisen beide Seiten hierfür denselben Wert auf, dann wird ein Fehler ausgegeben, wenn die Sortierfolgen nicht identisch sind.
Ein paar Beispiele:
column1 = 'A' |
Verwendet die Sortierfolge von column1
|
column1 = 'A' COLLATE x |
Verwendet die Sortierfolge von 'A'
|
column1 COLLATE x = 'A' COLLATE y |
Fehler |
Mithilfe der Funktion COERCIBILITY()
können
Sie den Sortierfolgenvorrangswert eines String-Ausdrucks
bestimmen:
mysql>SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
-> 0 mysql>SELECT COERCIBILITY(VERSION());
-> 3 mysql>SELECT COERCIBILITY('A');
-> 4
Siehe auch Abschnitt 12.10.3, „Informationsfunktionen“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.