MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Wie WEIGHT_STRING() in MariaDB funktioniert

In MariaDB WEIGHT_STRING() ist eine integrierte Funktion, die die Gewichtszeichenfolge für die Eingabezeichenfolge zurückgibt. 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 Sortierungsgewichtung der 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.

Syntax

Die Syntax lautet wie folgt:

WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
  levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ... 

Unten finden Sie eine Beschreibung jedes Arguments/jeder Klausel.

Der AS Klausel

Der optionale AS -Klausel ermöglicht das Umwandeln der Eingabezeichenfolge in eine binäre oder nicht-binäre Zeichenfolge sowie in eine bestimmte Länge.

  • AS BINARY(N) misst die Länge in Bytes statt in Zeichen und füllt rechts mit 0x00 Bytes auf die gewünschte Länge auf.
  • AS CHAR(N) misst die Länge in Zeichen und füllt mit Leerzeichen die gewünschte Länge auf.

N hat einen Mindestwert von 1 , und wenn sie kleiner als die Länge der Eingabezeichenfolge ist, wird die Zeichenfolge ohne Warnung abgeschnitten.

Der LEVEL Klausel

Gibt an, dass der Rückgabewert Gewichtungen für bestimmte Sortierebenen enthalten soll.

Die levels Bezeichner kann entweder eine einzelne Ganzzahl, eine durch Kommas getrennte Liste von Ganzzahlen oder eine Reihe von Ganzzahlen sein, die durch einen Bindestrich getrennt sind (Leerzeichen werden ignoriert). Ganzzahlen können von 1 reichen auf maximal 6 , abhängig von der Sortierung, und müssen in aufsteigender Reihenfolge aufgelistet werden.

  • Wenn der LEVEL -Klausel nicht angegeben ist, ein Standardwert von 1 bis zum Maximum für die Sortierung angenommen.
  • Wenn der LEVEL ohne Verwendung eines Bereichs angegeben wird, ist ein optionaler Modifikator erlaubt.
  • ASC (der Standardwert) gibt die Gewichtungen ohne Änderungen zurück.
  • DESC gibt bitweise invertierte Gewichtungen zurück.
  • REVERSE gibt die Gewichtungen in umgekehrter Reihenfolge zurück.

Beispiel

Hier ist ein einfaches Beispiel:

SELECT HEX(WEIGHT_STRING('z'));

Ergebnis:

+-------------------------+
| HEX(WEIGHT_STRING('z')) |
+-------------------------+
| 005A                    |
+-------------------------+

Hier verwenden wir das HEX() Funktion zur Darstellung nicht druckbarer Ergebnisse im Hexadezimalformat.

Der AS Klausel

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

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

Ergebnis (bei vertikaler Ausgabe):

  Char 3: 005A00200020
  Char 8: 005A0020002000200020002000200020
Binary 3: 7A0000
Binary 8: 7A00000000000000

Sammlung

Die folgenden zwei Beispiele zeigen, wie eine Zeichenfolge je nach verwendeter Sortierung eine andere Gewichtungszeichenfolge haben kann.

Bei der im ersten Beispiel verwendeten Sortierung wird die Groß-/Kleinschreibung nicht beachtet. Bei der im zweiten Beispiel verwendeten Sortierung wird zwischen Groß- und Kleinschreibung unterschieden.

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

Ergebnis:

+--------+----------+---------------+
| String | Hex      | Weight String |
+--------+----------+---------------+
| PLAY   | 504C4159 | 8F7941AA      |
| play   | 706C6179 | 8F7941AA      |
+--------+----------+---------------+

Und hier ist dasselbe Beispiel, außer mit einer Sortierung, bei der die Groß-/Kleinschreibung beachtet wird.

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

Ergebnis:

+--------+----------+---------------+
| String | Hex      | Weight String |
+--------+----------+---------------+
| PLAY   | 504C4159 | 8F7941AA      |
| play   | 706C6179 | 907A42AB      |
+--------+----------+---------------+

Null-Argumente

Übergabe von null gibt null zurück :

SELECT WEIGHT_STRING(null);

Ergebnis:

+---------------------+
| WEIGHT_STRING(null) |
+---------------------+
| NULL                |
+---------------------+

Fehlende Argumente

Aufruf von WEIGHT_STRING() mit der falschen Anzahl von Argumenten oder ohne Übergabe von Argumenten führt zu einem Fehler:

SELECT WEIGHT_STRING();

Ergebnis:

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