MySQL - lunghezza () vs char_length ()


215

Qual è la differenza principale tra length()e char_length()?

Credo che abbia qualcosa a che fare con le stringhe binarie e non binarie. C'è qualche motivo pratico per memorizzare le stringhe come binarie?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)

2
Sì, ci sono ragioni pratiche per memorizzare stringhe binarie quando in realtà sono stringhe binarie, ad esempio compresse.
sanmai,

Risposte:


351

LENGTH()restituisce la lunghezza della stringa misurata in byte .
CHAR_LENGTH()restituisce la lunghezza della stringa misurata in caratteri .

Ciò è particolarmente rilevante per Unicode, in cui la maggior parte dei caratteri è codificata in due byte. O UTF-8, dove varia il numero di byte. Per esempio:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

Come puoi vedere il simbolo dell'euro occupa 3 byte (è codificato come 0xE282ACin UTF-8) anche se è solo un carattere.


6
Solo UCS-2 è codificato in due byte per carattere. Questa codifica (o più precisamente UTF-16LE) è ciò che Windows chiama fuorviante "Unicode". MySQL non supporta UTF-16; invece il solito approccio per inserire stringhe Unicode è usare UTF-8.
Bobince,

2
Ad esempio: selezionare lunghezza ('日本語'), char_length ('日本語');
sanmai,

@bobince: anche UCS-2 codifica alcuni caratteri in più di 2 byte, ad esempio 0313 combining comma above. Poiché a = 61, 0x00610313 viene visualizzato come a̓ e occupa 4 byte.
Andomar,

2
In realtà dalla terminologia Unicode che è ancora 2 caratteri, anche se come tutti i segni combinati può - se è disponibile un carattere adatto - essere reso come un unico glifo. UTF-16LE può comunque avere un carattere a 4 byte, grazie ai surrogati.
bobince,

6
Quindi quale di queste funzioni dovrei usare per capire come ridimensionare le mie colonne VARCHAR? Quando si crea la tabella, supponiamo che una colonna sia un VARCHAR (10). Ciò consentirà un massimo di 10 caratteri o un massimo di 10 byte?
still_dreaming_1

19

varchar (10) memorizzerà 10 caratteri, che possono essere più di 10 byte. Negli indici, assegnerà la lunghezza massima del campo, quindi se si utilizza UTF8-mb4, assegnerà 40 byte per il campo di 10 caratteri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.