SET @test = 'test';
SELECT COERCIBILITY(@test), COERCIBILITY('test');
--- ---
2 4
Von der Dokumentation :
COERCIBILITY(str)
Die Rückgabewerte haben die in der folgenden Tabelle angegebenen Bedeutungen. Niedrigere Werte haben einen höheren Vorrang.
Coercibility Meaning Example
0 Explicit collation Value with COLLATE clause
1 No collation Concatenation of strings with different collations
2 Implicit collation Column value
3 System constant USER() return value
4 Coercible Literal string
5 Ignorable NULL or an expression derived from NULL
Die Zwangsläufigkeit legt fest, was im Falle eines Zuordnungskonflikts in was umgewandelt wird.
Ein Ausdruck mit höherer Koerzitivfeldstärke wird in die Kollation des Ausdrucks mit niedriger Koerzitivfeldstärke umgewandelt.
Diese Funktion ist nützlich, um Probleme mit der Sortierung zu beheben. Beispielsweise geben diese beiden Abfragen die Ergebnisse in unterschiedlicher Reihenfolge zurück.
Diese hier:
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT 'X'
) q
ORDER BY
col;
----
'test'
'X'
Und das hier:
SET @t := 'X' COLLATE UTF8_BIN;
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT @t
) q
ORDER BY
col;
----
'X'
'test'
Warum ist das so?
DATABASE()
ist eine Systemfunktion, deren Rückgabewerte die Koerzitivfeldstärke 3
und die standardmäßige Datenbanksortierung von UTF8_GENERAL_CI
.
X" in der ersten Abfrage ist ein Stringliteral mit der Zwangsläufigkeit von 4
.
Das Ergebnis der UNION
hat immer die geringste Zwangsläufigkeit aller Werte (d. h., 3
) und die Zusammenstellung des Ausdrucks mit der geringsten Kohärenz:
SELECT col, COERCIBILITY(col), COLLATION(col)
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT 'X'
) q
ORDER BY
col;
--------
'test', 3, 'utf8_general_ci'
'X', 3, 'utf8_general_ci'
In der zweiten Abfrage, @t
ist eine Variable, die den Wert einer Zeichenkette mit der Sortierreihenfolge UTF8_BIN
. Da ihre Zwangsläufigkeit geringer ist als die der Systemfunktion, wird in der Ergebnismenge die Sortierung der Variablen verwendet.
Die Zwangsläufigkeit der Variablen ist 2
Die Zwangsläufigkeit des Ergebnisses ist also die der Variablen und die der Sortierung:
SET @t := 'X' COLLATE UTF8_BIN;
SELECT col, COERCIBILITY(col), COLLATION(col)
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT @t
) q
ORDER BY
col;
--------
'X', 2, 'utf8_bin'
'test', 2, 'utf8_bin'