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