W MySQL funkcja WEIGHT_STRING()
funkcja 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 wagi sortowania dla 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. Zauważ, że jego zachowanie może się zmieniać pomiędzy wersjami MySQL.
Składnia
Składnia wygląda tak:
WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])
Gdzie str
jest ciągiem wejściowym. Opcjonalny AS
klauzula umożliwia rzutowanie ciągu wejściowego na dany typ i długość. Opcjonalne flags
argument nie jest obecnie używany w MySQL (od wersji 8.0).
Przykład 1 – Podstawowe użycie
Oto podstawowy przykład użycia niebinarnego ciągu wejściowego:
SELECT HEX(WEIGHT_STRING('Cat'));
Wynik:
+---------------------------+ | HEX(WEIGHT_STRING('Cat')) | +---------------------------+ | 1C7A1C471E95 | +---------------------------+
Zauważ, że używam HEX()
funkcja do wyświetlenia WEIGHT_STRING()
wynik. Dzieje się tak, ponieważ WEIGHT_STRING()
zwraca wynik binarny. Możemy użyć HEX()
aby wyświetlić wynik w formie do wydrukowania.
Jeśli nie używam HEX()
w tym przykładzie rozumiem:
SELECT WEIGHT_STRING('Cat');
Wynik:
+----------------------+ | WEIGHT_STRING('Cat') | +----------------------+ | zG? | +----------------------+
Żeby było jasne, oto łańcuch, szesnastkowa reprezentacja tego łańcucha i szesnastkowa reprezentacja jego łańcucha wagowego:
SET @str = 'Cat'; SELECT @str, HEX(@str), HEX(WEIGHT_STRING(@str));
Wynik:
+------+-----------+--------------------------+ | @str | HEX(@str) | HEX(WEIGHT_STRING(@str)) | +------+-----------+--------------------------+ | Cat | 436174 | 1C7A1C471E95 | +------+-----------+--------------------------+
Przykład 2 – Klauzula AS
Oto przykład użycia AS
klauzula do rzutowania ciągu wejściowego na podany typ i długość.
SET @str = 'Cat'; 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:
+--------------+--------------+----------+------------------+ | Char 3 | Char 8 | Binary 3 | Binary 8 | +--------------+--------------+----------+------------------+ | 1C7A1C471E95 | 1C7A1C471E95 | 436174 | 4361740000000000 | +--------------+--------------+----------+------------------+
Przykład 3 – Ukł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. Sortowanie użyte w pierwszym przykładzie jest niewrażliwe na akcent i wielkość liter. Porównywanie użyte w drugim przykładzie uwzględnia akcent i wielkość liter.
SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_ai_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 | +--------+--------+---------------+ | CAT | 434154 | 1C7A1C471E95 | | cat | 636174 | 1C7A1C471E95 | +--------+--------+---------------+
A oto ten sam przykład, z wyjątkiem sortowania uwzględniającego akcent i wielkość liter.
SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_as_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 | +--------+--------+----------------------------------------------+ | CAT | 434154 | 1C7A1C471E9500000020002000200000000800080008 | | cat | 636174 | 1C7A1C471E9500000020002000200000000200020002 | +--------+--------+----------------------------------------------+