Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL length() vs char_length()

Dans MySQL, il y a plusieurs fois où le length() fonction et la char_length() fonction fournira exactement les mêmes résultats. Cependant, il y a aussi des moments où les résultats seront complètement différents. Voici pourquoi.

Voici d'abord la définition de chacune de ces fonctions :

char_length()
Renvoie la longueur d'une chaîne, mesurée en caractères.
length()
Renvoie la longueur d'une chaîne, mesurée en octets.

Remarquez "caractères" vs "octets" - un est mesuré en caractères , l'autre est mesuré en octets .

Dans de nombreux cas, le nombre d'octets sera le même que le nombre de caractères dans la chaîne, mais ce n'est pas toujours le cas. Le nombre d'octets utilisés par caractère dépend de la façon dont les données sont stockées. Par exemple, si la chaîne est stockée sous forme de données Unicode, il y aura 2 octets par caractère.

Voici un exemple de base utilisant du texte ASCII (où les deux fonctions renvoient le même résultat) :

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

Résultat :

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

Et souvent nous obtiendrons le même résultat si la chaîne est stockée dans une base de données :

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

Résultat :

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

Cependant, si nous modifions la colonne de la base de données pour stocker les données au format unicode :

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

Et relancez la même requête :

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

Nous obtenons un résultat différent :

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

En effet, Unicode stocke chaque caractère sur 2 octets.

Ceci est similaire à la différence entre datalength() et len() en T-SQL.

MySQL a aussi le octet_length() fonction, qui est synonyme de length() .