6 Stimmen

Was bedeutet Zwangsläufigkeit? MySQL-Benutzervariablen

Alle Benutzervariablen haben eine implizite Koerzitivitätswert

Was bedeutet das? Hat das etwas zu tun mit ...

mysql> SET @a = 1; 
mysql> SET @A = @a; 
mysql> SELECT @a, @A;
mysql> SELECT @a, @A;
+------+------+
| @a    | @A    |
+------+------+
| 1 | 1 |
+------+------+
mysql> SET @a = 2;
mysql> SELECT @a, @A;
mysql> SELECT @a, @A;
+------+------+
| @a    | @A    |
+------+------+
| 2 | 2 |
+------+------+

wobei @A 2 zugewiesen wird, vielleicht weil es "referenziert" @a?

9voto

Quassnoi Punkte 396418
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'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X