MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona WEIGHT_STRING() in MariaDB

In MariaDB, WEIGHT_STRING() è una funzione incorporata che restituisce la stringa di peso per la stringa di input. Il valore restituito è una stringa binaria che rappresenta il valore di confronto e ordinamento della stringa.

Se la stringa di input è un valore non binario, il valore restituito contiene il peso delle regole di confronto della stringa. Se è un valore binario, il risultato è lo stesso della stringa di input. Questo perché il peso per ogni byte in una stringa binaria è il valore del byte.

Questa funzione è una funzione di debug destinata all'uso interno. Può essere utilizzato per il test e il debug delle regole di confronto.

Sintassi

La sintassi è questa:

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

Di seguito è riportata una descrizione di ogni argomento/clausola.

Il AS Clausola

Il AS opzionale La clausola consente di eseguire il cast della stringa di input su una stringa binaria o non binaria, nonché su una lunghezza particolare.

  • AS BINARY(N) misura la lunghezza in byte anziché in caratteri e i tasti di destra con 0x00 byte alla lunghezza desiderata.
  • AS CHAR(N) misura la lunghezza in caratteri e pad destro con spazi alla lunghezza desiderata.

N ha un valore minimo di 1 e se è inferiore alla lunghezza della stringa di input, la stringa viene troncata senza preavviso.

Il LEVEL Clausola

Specifica che il valore restituito deve contenere pesi per livelli di confronto specifici.

levels lo specificatore può essere un singolo numero intero, un elenco di numeri interi separati da virgole o un intervallo di numeri interi separati da un trattino (gli spazi vuoti vengono ignorati). I numeri interi possono variare da 1 fino a un massimo di 6 , a seconda delle regole di confronto e devono essere elencate in ordine crescente.

  • Se il LEVEL non viene fornita la clausola, un valore predefinito di 1 al massimo per la raccolta.
  • Se il LEVEL è specificato senza utilizzare un intervallo, è consentito un modificatore facoltativo.
  • ASC (di default) restituisce i pesi senza alcuna modifica.
  • DESC restituisce pesi invertiti bit per bit.
  • REVERSE restituisce i pesi in ordine inverso.

Esempio

Ecco un esempio di base:

SELECT HEX(WEIGHT_STRING('z'));

Risultato:

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

Qui utilizziamo HEX() funzione per rappresentare i risultati non stampabili in formato esadecimale.

Il AS Clausola

Ecco un esempio usando AS clausola per eseguire il cast della stringa di input su un determinato tipo e lunghezza.

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

Risultato (usando l'output verticale):

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

Fascicolazione

I due esempi seguenti mostrano come una stringa può avere una stringa di peso diversa, a seconda delle regole di confronto utilizzate.

Le regole di confronto utilizzate nel primo esempio non fanno distinzione tra maiuscole e minuscole. Le regole di confronto utilizzate nel secondo esempio fanno distinzione tra maiuscole e minuscole.

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

Risultato:

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

Ed ecco lo stesso esempio, tranne che per le regole di confronto con distinzione tra maiuscole e minuscole.

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

Risultato:

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

Argomenti nulli

Passaggio null restituisce null :

SELECT WEIGHT_STRING(null);

Risultato:

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

Argomenti mancanti

Chiamando WEIGHT_STRING() con il numero errato di argomenti o senza passare alcun argomento genera un errore:

SELECT WEIGHT_STRING();

Risultato:

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