Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL length() vs char_length()


No MySQL, há muitas vezes em que o length() função e o char_length() A função fornecerá exatamente os mesmos resultados. No entanto, também há momentos em que os resultados serão completamente diferentes. Aqui está o porquê.

Primeiro, aqui está a definição para cada uma dessas funções:
char_length()
Retorna o comprimento de uma string, medido em caracteres.
length()
Retorna o comprimento de uma string, medido em bytes.

Observe “caracteres” versus “bytes” – um é medido em caracteres , o outro é medido em bytes .

Em muitos casos, o número de bytes será o mesmo que o número de caracteres na string, mas nem sempre é esse o caso. O número de bytes usados ​​por caractere depende de como os dados são armazenados. Por exemplo, se a string for armazenada como dados Unicode, haverá 2 bytes por caractere.

Aqui está um exemplo básico usando texto ASCII (onde ambas as funções retornam o mesmo resultado):
SELECT 
    CHAR_LENGTH('Lit'), 
    LENGTH('Lit');

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

E muitas vezes obteremos o mesmo resultado se a string for armazenada em um banco de dados:
SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

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

No entanto, se alterarmos a coluna do banco de dados para armazenar os dados como unicode:
ALTER TABLE Artists 
MODIFY COLUMN ArtistName VARCHAR(255) unicode;

E, em seguida, execute a mesma consulta novamente:
SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

Obtemos um resultado diferente:
+-------------------------+--------------------+
| CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) |
+-------------------------+--------------------+
|                       3 |                  6 |
+-------------------------+--------------------+

Isso ocorre porque o unicode armazena cada caractere como 2 bytes.

Isso é semelhante à diferença entre datalength() e len() em T-SQL.

MySQL também tem o octet_length() função, que é sinônimo de length() .