MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment WEIGHT_STRING() fonctionne dans MariaDB

Dans MariaDB, WEIGHT_STRING() est une fonction intégrée qui renvoie la chaîne de poids pour la chaîne d'entrée. La valeur de retour est une chaîne binaire qui représente la valeur de comparaison et de tri de la chaîne.

Si la chaîne d'entrée est une valeur non binaire, la valeur de retour contient le poids de classement de la chaîne. S'il s'agit d'une valeur binaire, le résultat est le même que la chaîne d'entrée. En effet, le poids de chaque octet d'une chaîne binaire est la valeur de l'octet.

Cette fonction est une fonction de débogage destinée à un usage interne. Il peut être utilisé pour tester et déboguer les classements.

Syntaxe

La syntaxe ressemble à ceci :

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

Vous trouverez ci-dessous une description de chaque argument/clause.

Le AS Article

Le AS facultatif La clause permet de convertir la chaîne d'entrée en une chaîne binaire ou non binaire, ainsi qu'à une longueur particulière.

  • AS BINARY(N) mesure la longueur en octets plutôt qu'en caractères, et remplit à droite avec 0x00 octets jusqu'à la longueur souhaitée.
  • AS CHAR(N) mesure la longueur en caractères et remplit à droite avec des espaces à la longueur souhaitée.

N a une valeur minimale de 1 , et si elle est inférieure à la longueur de la chaîne d'entrée, la chaîne est tronquée sans avertissement.

Le LEVEL Article

Spécifie que la valeur de retour doit contenir des pondérations pour des niveaux de classement spécifiques.

Les levels Le spécificateur peut être un entier unique, une liste d'entiers séparés par des virgules ou une plage d'entiers séparés par un tiret (les espaces blancs sont ignorés). Les nombres entiers peuvent aller de 1 jusqu'à un maximum de 6 , en fonction du classement, et doivent être répertoriés par ordre croissant.

  • Si le LEVEL la clause n'est pas fournie, la valeur par défaut est 1 au maximum pour le classement est supposé.
  • Si le LEVEL est spécifié sans utiliser de plage, un modificateur facultatif est autorisé.
  • ASC (par défaut) renvoie les poids sans aucune modification.
  • DESC renvoie des poids inversés au niveau du bit.
  • REVERSE renvoie les poids dans l'ordre inverse.

Exemple

Voici un exemple de base :

SELECT HEX(WEIGHT_STRING('z'));

Résultat :

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

Ici, nous utilisons le HEX() fonction pour représenter les résultats non imprimables au format hexadécimal.

Le AS Article

Voici un exemple utilisant le AS clause pour convertir la chaîne d'entrée en un type et une longueur donnés.

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

Résultat (en utilisant la sortie verticale) :

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

Collation

Les deux exemples suivants montrent comment une chaîne peut avoir une chaîne de poids différente, selon le classement utilisé.

Le classement utilisé dans le premier exemple ne respecte pas la casse. Le classement utilisé dans le deuxième exemple est sensible à la casse.

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

Résultat :

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

Et voici le même exemple, sauf avec un classement sensible à la casse.

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

Résultat :

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

Arguments nuls

Passer null renvoie null :

SELECT WEIGHT_STRING(null);

Résultat :

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

Arguments manquants

Appel de WEIGHT_STRING() avec le mauvais nombre d'arguments, ou sans passage d'arguments, une erreur se produit :

SELECT WEIGHT_STRING();

Résultat :

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