W MariaDB WEIGHT_STRING()
to wbudowana funkcja, która zwraca ciąg wagi dla ciągu wejściowego. Wartość zwracana to ciąg binarny, który reprezentuje wartość porównywania i sortowania ciągu.
Jeśli ciąg wejściowy jest wartością niebinarną, wartość zwracana zawiera wagę sortowania ciągu. Jeśli jest to wartość binarna, wynik jest taki sam jak ciąg wejściowy. Dzieje się tak, ponieważ waga każdego bajtu w ciągu binarnym jest wartością bajtu.
Ta funkcja jest funkcją debugowania przeznaczoną do użytku wewnętrznego. Może być używany do testowania i debugowania sortowania.
Składnia
Składnia wygląda tak:
WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ...
Poniżej znajduje się opis każdego argumentu/klauzuli.
AS
Klauzula
Opcjonalny AS
Klauzula zezwala na rzutowanie ciągu wejściowego na ciąg binarny lub niebinarny, a także o określonej długości.
AS BINARY(N)
mierzy długość w bajtach, a nie w znakach, a prawe pady z 0x00 bajtami do pożądanej długości.AS CHAR(N)
mierzy długość w znakach, a prawe pady ze spacjami do żądanej długości.
N
ma minimalną wartość 1
, a jeśli jest mniejsza niż długość ciągu wejściowego, ciąg jest obcinany bez ostrzeżenia.
LEVEL
Klauzula
Określa, że zwracana wartość powinna zawierać wagi dla określonych poziomów sortowania.
levels
specyfikator może być pojedynczą liczbą całkowitą, listą liczb całkowitych oddzielonych przecinkami lub zakresem liczb całkowitych oddzielonych myślnikiem (białe znaki są ignorowane). Liczby całkowite mogą wynosić od 1
maksymalnie do 6
, w zależności od sortowania i muszą być wymienione w porządku rosnącym.
- Jeśli
LEVEL
klauzula nie jest podana, domyślnie1
do maksimum dla porównania. - Jeśli
LEVEL
jest określony bez użycia zakresu, dozwolony jest opcjonalny modyfikator. ASC
(domyślnie) zwraca wagi bez żadnych modyfikacji.DESC
zwraca wagi odwrócone bitowo.REVERSE
zwraca wagi w odwrotnej kolejności.
Przykład
Oto podstawowy przykład:
SELECT HEX(WEIGHT_STRING('z'));
Wynik:
+-------------------------+ | HEX(WEIGHT_STRING('z')) | +-------------------------+ | 005A | +-------------------------+
Tutaj używamy HEX()
funkcja do reprezentowania wyników niedrukowalnych w formacie szesnastkowym.
AS
Klauzula
Oto przykład użycia AS
klauzula do rzutowania ciągu wejściowego na podany typ i długość.
SET @str = 'z';
SELECT
HEX(WEIGHT_STRING(@str AS CHAR(3))) 'Char 3',
HEX(WEIGHT_STRING(@str AS CHAR(8))) 'Char 8',
HEX(WEIGHT_STRING(@str AS BINARY(3))) 'Binary 3',
HEX(WEIGHT_STRING(@str AS BINARY(8))) 'Binary 8';
Wynik (przy użyciu wyjścia pionowego):
Char 3: 005A00200020 Char 8: 005A0020002000200020002000200020 Binary 3: 7A0000 Binary 8: 7A00000000000000
Składanie
Poniższe dwa przykłady pokazują, jak ciąg może mieć inny ciąg wagi, w zależności od użytego sortowania.
W sortowaniu użytym w pierwszym przykładzie nie jest rozróżniana wielkość liter. W sortowaniu użytym w drugim przykładzie rozróżniana jest wielkość liter.
SET @upper = _latin1 'PLAY' COLLATE latin1_general_ci;
SET @lower = lcase(@upper);
SELECT
@upper 'String',
HEX(@upper) 'Hex',
HEX(WEIGHT_STRING(@upper)) 'Weight String'
UNION ALL
SELECT
@lower,
HEX(@lower),
HEX(WEIGHT_STRING(@lower));
Wynik:
+--------+----------+---------------+ | String | Hex | Weight String | +--------+----------+---------------+ | PLAY | 504C4159 | 8F7941AA | | play | 706C6179 | 8F7941AA | +--------+----------+---------------+
A oto ten sam przykład, z wyjątkiem sortowania z rozróżnianiem wielkości liter.
SET @upper = _latin1 'PLAY' COLLATE latin1_general_cs;
SET @lower = lcase(@upper);
SELECT
@upper 'String',
HEX(@upper) 'Hex',
HEX(WEIGHT_STRING(@upper)) 'Weight String'
UNION ALL
SELECT
@lower,
HEX(@lower),
HEX(WEIGHT_STRING(@lower));
Wynik:
+--------+----------+---------------+ | String | Hex | Weight String | +--------+----------+---------------+ | PLAY | 504C4159 | 8F7941AA | | play | 706C6179 | 907A42AB | +--------+----------+---------------+
Argumenty zerowe
Przekazywanie null
zwraca null
:
SELECT WEIGHT_STRING(null);
Wynik:
+---------------------+ | WEIGHT_STRING(null) | +---------------------+ | NULL | +---------------------+
Brakujące argumenty
Wywołanie WEIGHT_STRING()
z niewłaściwą liczbą argumentów lub bez przekazania jakichkolwiek argumentów powoduje błąd:
SELECT WEIGHT_STRING();
Wynik:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1