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()
.