Mysql
 sql >> Database >  >> RDS >> Mysql

Come funziona la funzione WEIGHT_STRING() in MySQL

In MySQL, il WEIGHT_STRING() la funzione 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 i pesi di confronto per la 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. Nota che il suo comportamento può cambiare tra le versioni di MySQL.

Sintassi

La sintassi è questa:

WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])

Dove str è la stringa di input. Il AS opzionale La clausola consente di eseguire il cast della stringa di input su un determinato tipo e lunghezza. I flags opzionali argomento non è attualmente utilizzato in MySQL (a partire dalla versione 8.0).

Esempio 1 – Utilizzo di base

Ecco un esempio di base di utilizzo utilizzando una stringa di input non binaria:

SELECT HEX(WEIGHT_STRING('Cat'));

Risultato:

+---------------------------+
| HEX(WEIGHT_STRING('Cat')) |
+---------------------------+
| 1C7A1C471E95              |
+---------------------------+

Nota che uso HEX() funzione per visualizzare il WEIGHT_STRING() risultato. Questo perché WEIGHT_STRING() restituisce un risultato binario. Possiamo usare HEX() per visualizzare il risultato in un modulo stampabile.

Se non utilizzo HEX() in questo esempio ottengo questo:

SELECT WEIGHT_STRING('Cat');

Risultato:

+----------------------+
| WEIGHT_STRING('Cat') |
+----------------------+
| zG?                |
+----------------------+

Quindi, solo per essere chiari, ecco la stringa, la rappresentazione esadecimale di quella stringa e la rappresentazione esadecimale della sua stringa di peso:

SET @str = 'Cat';
SELECT @str, HEX(@str), HEX(WEIGHT_STRING(@str));

Risultato:

+------+-----------+--------------------------+
| @str | HEX(@str) | HEX(WEIGHT_STRING(@str)) |
+------+-----------+--------------------------+
| Cat  | 436174    | 1C7A1C471E95             |
+------+-----------+--------------------------+

Esempio 2 – La clausola AS

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

SET @str = 'Cat';
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:

+--------------+--------------+----------+------------------+
| Char 3       | Char 8       | Binary 3 | Binary 8         |
+--------------+--------------+----------+------------------+
| 1C7A1C471E95 | 1C7A1C471E95 | 436174   | 4361740000000000 |
+--------------+--------------+----------+------------------+

Esempio 3 – 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 accenti e maiuscole e minuscole. Le regole di confronto utilizzate nel secondo esempio fanno distinzione tra accenti e maiuscole.

SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_ai_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 |
+--------+--------+---------------+
| CAT    | 434154 | 1C7A1C471E95  |
| cat    | 636174 | 1C7A1C471E95  |
+--------+--------+---------------+

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

SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_as_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                                |
+--------+--------+----------------------------------------------+
| CAT    | 434154 | 1C7A1C471E9500000020002000200000000800080008 |
| cat    | 636174 | 1C7A1C471E9500000020002000200000000200020002 |
+--------+--------+----------------------------------------------+