sql >> Databáze >  >> RDS >> MariaDB

Jak funguje WEIGHT_STRING() v MariaDB

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 je 1 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

  1. Proč se sekvence ID SQL nesynchronizují (konkrétně pomocí Postgres)?

  2. Oprava „datum je nekompatibilní s int“ v SQL Server při přidávání nebo odečítání od data

  3. Výhody indexování cizích klíčů

  4. Jak mohu změnit výchozí časový limit připojení Mysql při připojování přes python?