Wszystkie zmienne użytkownika mają domyślne znaczenie wartość koercyjności
co to znaczy? czy to ma coś wspólnego z ...
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 | + ------ + ------ +
gdzie @A jest przypisane 2 może dlatego, że "odwołuje się" @a?
Odpowiedzi:
8 dla odpowiedzi № 1SET @test = "test";
SELECT COERCIBILITY(@test), COERCIBILITY("test");
--- ---
2 4
Od dokumentacja:
COERCIBILITY(str)
Wartości zwracane mają znaczenia przedstawione w poniższej tabeli. Niższe wartości mają wyższy priorytet.
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
Coercibility określa, co zostanie przekonwertowane na to, co w przypadku konfliktu zestawiania.
Ekspresja o większej koercyjności zostanie przekształcona w zbiór ekspresji o mniejszej koercyjności.
Ta funkcja jest przydatna przy rozwiązywaniu problemów z sortowaniem. Na przykład te dwa zapytania zwracają wyniki w innej kolejności.
Ten:
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT "X"
) q
ORDER BY
col;
----
"test"
"X"
I ten:
SET @t := "X" COLLATE UTF8_BIN;
SELECT col
FROM (
SELECT DATABASE() AS col
UNION ALL
SELECT @t
) q
ORDER BY
col;
----
"X"
"test"
Dlaczego tak?
DATABASE()
jest funkcją systemową, której wartości zwracane mają spójność 3
i domyślne sortowanie bazy danych dla UTF8_GENERAL_CI
.
"X" w pierwszym zapytaniu to literał łańcuchowy o spójności z 4
.
Wynik UNION
zawsze będzie miał najmniejszą spójność wszystkich wartości (tj. 3
) i zestawienie wyrażenia z najmniejszą spójnością:
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"
W drugim zapytaniu @t
jest zmienną przechowującą wartość ciągu z sortowaniem UTF8_BIN
. Ponieważ jego koercyjność jest mniejsza niż funkcja systemu, jest to sortowanie zmiennych, które jest używane w zestawie wyników.
Zbieżność zmiennej to 2
, więc koherentność wyniku jest taka sama jak w przypadku zmiennej, a także w zestawieniu:
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"