sql >> Databasteknik >  >> RDS >> MariaDB

Hur WEIGHT_STRING() fungerar i MariaDB

I MariaDB, WEIGHT_STRING() är en inbyggd funktion som returnerar viktsträngen för inmatningssträngen. Returvärdet är en binär sträng som representerar jämförelse- och sorteringsvärdet för strängen.

Om inmatningssträngen är ett icke-binärt värde, innehåller returvärdet strängens sorteringsvikt. Om det är ett binärt värde är resultatet detsamma som inmatningssträngen. Detta beror på att vikten för varje byte i en binär sträng är bytevärdet.

Denna funktion är en felsökningsfunktion avsedd för internt bruk. Den kan användas för testning och felsökning av kollationer.

Syntax

Syntaxen ser ut så här:

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

Nedan finns en beskrivning av varje argument/klausul.

AS Klausul

Den valfria AS satsen tillåter casting av inmatningssträngen till en binär eller icke-binär sträng, såväl som till en viss längd.

  • AS BINARY(N) mäter längden i byte snarare än tecken, och höger knappar med 0x00 byte till önskad längd.
  • AS CHAR(N) mäter längden i tecken och höger block med blanksteg till önskad längd.

N har ett lägsta värde på 1 , och om den är mindre än längden på inmatningssträngen, trunkeras strängen utan förvarning.

LEVEL Klausul

Anger att returvärdet ska innehålla vikter för specifika sorteringsnivåer.

 levels specificator kan antingen vara ett enstaka heltal, en kommaseparerad lista med heltal eller ett intervall av heltal separerade med ett bindestreck (blanksteg ignoreras). Heltal kan variera från 1 till maximalt 6 , beroende på sorteringen och måste listas i stigande ordning.

  • Om LEVEL klausul tillhandahålls inte, en standard på 1 maximalt för sammanställningen antas.
  • Om LEVEL anges utan att använda ett intervall, är en valfri modifierare tillåten.
  • ASC (standard) returnerar vikterna utan några ändringar.
  • DESC returnerar bitvis inverterade vikter.
  • REVERSE returnerar vikterna i omvänd ordning.

Exempel

Här är ett grundläggande exempel:

SELECT HEX(WEIGHT_STRING('z'));

Resultat:

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

Här använder vi HEX() funktion för att representera icke-utskrivbara resultat i hexadecimalt format.

AS Klausul

Här är ett exempel med AS sats för att kasta inmatningssträngen till en given typ och längd.

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

Resultat (med vertikal utdata):

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

Sortering

Följande två exempel visar hur en sträng kan ha olika vikt, beroende på vilken sortering som används.

Den sammanställning som används i det första exemplet är skiftlägesokänslig. Den sortering som används i det andra exemplet är skiftlägeskänslig.

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

Resultat:

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

Och här är samma exempel, förutom med en skiftlägeskänslig sortering.

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

Resultat:

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

Nollargument

Skickar null returnerar null :

SELECT WEIGHT_STRING(null);

Resultat:

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

Argument saknas

Ringer WEIGHT_STRING() med fel antal argument, eller utan att skicka några argument resulterar i ett fel:

SELECT WEIGHT_STRING();

Resultat:

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

  1. WHERE_IN fråga med en sammansatt nyckel?

  2. Matcha utbud med efterfrågan – lösningar, del 1

  3. Begränsande returnerad post från SQL-fråga i Oracle

  4. DECOMPOSE() Funktion i Oracle