Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Funktionsweise der Funktion WEIGHT_STRING() in MySQL

In MySQL der WEIGHT_STRING() Die Funktion gibt die Gewichtungszeichenfolge für die Eingabezeichenfolge zurück. Der Rückgabewert ist ein binärer String, der den Vergleichs- und Sortierwert des Strings darstellt.

Wenn die Eingabezeichenfolge ein nichtbinärer Wert ist, enthält der Rückgabewert die Sortierungsgewichtungen für die Zeichenfolge. Wenn es sich um einen Binärwert handelt, ist das Ergebnis dasselbe wie die Eingabezeichenfolge. Dies liegt daran, dass die Gewichtung für jedes Byte in einer binären Zeichenfolge der Bytewert ist.

Diese Funktion ist eine Debugging-Funktion, die für den internen Gebrauch bestimmt ist. Es kann zum Testen und Debuggen von Sortierungen verwendet werden. Beachten Sie, dass sich sein Verhalten zwischen MySQL-Versionen ändern kann.

Syntax

Die Syntax lautet wie folgt:

WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])

Wobei str ist die Eingabezeichenfolge. Der optionale AS -Klausel können Sie die Eingabezeichenfolge in einen bestimmten Typ und eine bestimmte Länge umwandeln. Die optionalen flags Argument wird derzeit in MySQL (ab Version 8.0) nicht verwendet.

Beispiel 1 – Grundlegende Verwendung

Hier ist ein einfaches Verwendungsbeispiel mit einer nichtbinären Eingabezeichenfolge:

SELECT HEX(WEIGHT_STRING('Cat'));

Ergebnis:

+---------------------------+
| HEX(WEIGHT_STRING('Cat')) |
+---------------------------+
| 1C7A1C471E95              |
+---------------------------+

Beachten Sie, dass ich den HEX() verwende Funktion, um WEIGHT_STRING() anzuzeigen Ergebnis. Das liegt daran, dass WEIGHT_STRING() gibt ein binäres Ergebnis zurück. Wir können HEX() verwenden um das Ergebnis in druckbarer Form anzuzeigen.

Wenn ich HEX() nicht verwende In diesem Beispiel erhalte ich Folgendes:

SELECT WEIGHT_STRING('Cat');

Ergebnis:

+----------------------+
| WEIGHT_STRING('Cat') |
+----------------------+
| zG?                |
+----------------------+

Nur um das klarzustellen, hier ist der String, die hexadezimale Darstellung dieses Strings und die hexadezimale Darstellung seines Gewichtungs-Strings:

SET @str = 'Cat';
SELECT @str, HEX(@str), HEX(WEIGHT_STRING(@str));

Ergebnis:

+------+-----------+--------------------------+
| @str | HEX(@str) | HEX(WEIGHT_STRING(@str)) |
+------+-----------+--------------------------+
| Cat  | 436174    | 1C7A1C471E95             |
+------+-----------+--------------------------+

Beispiel 2 – Die AS-Klausel

Hier ist ein Beispiel mit AS -Klausel, um die Eingabezeichenfolge in einen bestimmten Typ und eine bestimmte Länge umzuwandeln.

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';

Ergebnis:

+--------------+--------------+----------+------------------+
| Char 3       | Char 8       | Binary 3 | Binary 8         |
+--------------+--------------+----------+------------------+
| 1C7A1C471E95 | 1C7A1C471E95 | 436174   | 4361740000000000 |
+--------------+--------------+----------+------------------+

Beispiel 3 – Sortierung

Die folgenden zwei Beispiele zeigen, wie eine Zeichenfolge je nach verwendeter Sortierung eine andere Gewichtungszeichenfolge haben kann. Bei der im ersten Beispiel verwendeten Kollatierung werden Akzente und Groß- und Kleinschreibung nicht berücksichtigt. Bei der im zweiten Beispiel verwendeten Kollatierung werden Akzente und Groß- und Kleinschreibung beachtet.

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));

Ergebnis:

+--------+--------+---------------+
| String | Hex    | Weight String |
+--------+--------+---------------+
| CAT    | 434154 | 1C7A1C471E95  |
| cat    | 636174 | 1C7A1C471E95  |
+--------+--------+---------------+

Und hier ist dasselbe Beispiel, außer mit einer Kollatierung, bei der Akzente und Groß-/Kleinschreibung beachtet werden.

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));

Ergebnis:

+--------+--------+----------------------------------------------+
| String | Hex    | Weight String                                |
+--------+--------+----------------------------------------------+
| CAT    | 434154 | 1C7A1C471E9500000020002000200000000800080008 |
| cat    | 636174 | 1C7A1C471E9500000020002000200000000200020002 |
+--------+--------+----------------------------------------------+