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.

I 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