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

MySQL length() vs char_length()

In MySQL, ci sono molte volte in cui length() funzione e char_length() funzione fornirà esattamente gli stessi risultati. Tuttavia, ci sono anche momenti in cui i risultati saranno completamente diversi. Ecco perché.

Innanzitutto, ecco la definizione per ciascuna di queste funzioni:

char_length()
Restituisce la lunghezza di una stringa, misurata in caratteri.
length()
Restituisce la lunghezza di una stringa, misurata in byte.

Nota "caratteri" rispetto a "byte":uno viene misurato in caratteri , l'altro è misurato in byte .

In molti casi, il numero di byte sarà uguale al numero di caratteri nella stringa, ma non è sempre così. Il numero di byte utilizzati per carattere dipende da come vengono archiviati i dati. Ad esempio, se la stringa è archiviata come dati Unicode, ci saranno 2 byte per carattere.

Ecco un esempio di base che utilizza il testo ASCII (dove entrambe le funzioni restituiscono lo stesso risultato):

SELECT 
    CHAR_LENGTH('Lit'), 
    LENGTH('Lit');

Risultato:

+--------------------+---------------+
| CHAR_LENGTH('Lit') | LENGTH('Lit') |
+--------------------+---------------+
|                  3 |             3 |
+--------------------+---------------+

E spesso otterremo lo stesso risultato se la stringa è archiviata in un database:

SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

Risultato:

+-------------------------+--------------------+
| CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) |
+-------------------------+--------------------+
|                       3 |                  3 |
+-------------------------+--------------------+

Tuttavia, se cambiamo la colonna del database per memorizzare i dati come unicode:

ALTER TABLE Artists 
MODIFY COLUMN ArtistName VARCHAR(255) unicode;

E quindi esegui di nuovo la stessa query:

SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

Otteniamo un risultato diverso:

+-------------------------+--------------------+
| CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) |
+-------------------------+--------------------+
|                       3 |                  6 |
+-------------------------+--------------------+

Questo perché unicode memorizza ogni carattere come 2 byte.

È simile alla differenza tra datalength() e len() in T-SQL.

MySQL ha anche octet_length() funzione, che è sinonimo di length() .