/ / Co oznacza Zadowolenie? Zmienne użytkownika MySQL - mysql

Co oznacza Zadowolenie? Zmienne użytkownika MySQL - mysql

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 № 1
SET @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"