V MariaDB, WEIGHT_STRING()
je vestavěná funkce, která vrací váhový řetězec pro vstupní řetězec. Vrácená hodnota je binární řetězec, který představuje hodnotu porovnání a řazení řetězce.
Pokud je vstupní řetězec nebinární hodnotou, vrácená hodnota obsahuje váhu řazení řetězce. Pokud se jedná o binární hodnotu, výsledek je stejný jako vstupní řetězec. Je to proto, že váha každého bajtu v binárním řetězci je hodnota bajtu.
Tato funkce je funkce ladění určená pro interní použití. Lze jej použít pro testování a ladění porovnávání.
Syntaxe
Syntaxe vypadá takto:
WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ...
Níže je uveden popis každého argumentu/klauzule.
AS
Ustanovení
Volitelný AS
klauzule umožňuje přetypování vstupního řetězce na binární nebo nebinární řetězec a také na určitou délku.
AS BINARY(N)
měří délku v bajtech, nikoli ve znacích, a pravé podložky s 0x00 bajty na požadovanou délku.AS CHAR(N)
měří délku ve znacích a pravé plošky s mezerami na požadovanou délku.
N
má minimální hodnotu 1
a pokud je menší než délka vstupního řetězce, bude řetězec bez varování zkrácen.
LEVEL
Ustanovení
Určuje, že vrácená hodnota by měla obsahovat váhy pro konkrétní úrovně řazení.
levels
specifikátor může být buď jedno celé číslo, čárkou oddělený seznam celých čísel nebo rozsah celých čísel oddělených pomlčkou (mezery se ignorují). Celá čísla se mohou pohybovat od 1
maximálně 6
, v závislosti na řazení a musí být uvedeny ve vzestupném pořadí.
- Pokud je
LEVEL
klauzule není poskytnuta, výchozí hodnota je1
na maximum pro porovnávání se předpokládá. - Pokud je
LEVEL
je zadán bez použití rozsahu, je povolen volitelný modifikátor. ASC
(výchozí) vrací váhy bez jakékoli úpravy.DESC
vrátí bitově invertované váhy.REVERSE
vrátí váhy v opačném pořadí.
Příklad
Zde je základní příklad:
SELECT HEX(WEIGHT_STRING('z'));
Výsledek:
+-------------------------+ | HEX(WEIGHT_STRING('z')) | +-------------------------+ | 005A | +-------------------------+
Zde používáme HEX()
funkci reprezentovat netisknutelné výsledky v hexadecimálním formátu.
AS
Ustanovení
Zde je příklad použití AS
klauzule k přetypování vstupního řetězce na daný typ a délku.
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';
Výsledek (při použití vertikálního výstupu):
Char 3: 005A00200020 Char 8: 005A0020002000200020002000200020 Binary 3: 7A0000 Binary 8: 7A00000000000000
Řazení
Následující dva příklady ukazují, jak může mít řetězec různou váhu v závislosti na použitém řazení.
Porovnání použité v prvním příkladu nerozlišuje malá a velká písmena. Porovnání použité ve druhém příkladu rozlišuje velká a malá písmena.
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));
Výsledek:
+--------+----------+---------------+ | String | Hex | Weight String | +--------+----------+---------------+ | PLAY | 504C4159 | 8F7941AA | | play | 706C6179 | 8F7941AA | +--------+----------+---------------+
A zde je stejný příklad, s výjimkou řazení rozlišující malá a velká písmena.
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));
Výsledek:
+--------+----------+---------------+ | String | Hex | Weight String | +--------+----------+---------------+ | PLAY | 504C4159 | 8F7941AA | | play | 706C6179 | 907A42AB | +--------+----------+---------------+
Nulové argumenty
Předávání null
vrátí null
:
SELECT WEIGHT_STRING(null);
Výsledek:
+---------------------+ | WEIGHT_STRING(null) | +---------------------+ | NULL | +---------------------+
Chybí argumenty
Volání WEIGHT_STRING()
s nesprávným počtem argumentů nebo bez předání jakýchkoli argumentů vede k chybě:
SELECT WEIGHT_STRING();
Výsledek:
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