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

MySQL length() vs char_length()

I MySQL er der mange gange, hvor length() funktionen og char_length() funktion vil give nøjagtig de samme resultater. Der er dog også tidspunkter, hvor resultaterne vil være helt anderledes. Her er hvorfor.

For det første er her definitionen for hver af disse funktioner:

char_length()
Returnerer længden af ​​en streng, målt i tegn.
length()
Returnerer længden af ​​en streng, målt i bytes.

Bemærk "tegn" vs "bytes" - en måles i tegn , den anden måles i bytes .

I mange tilfælde vil antallet af bytes være det samme som antallet af tegn i strengen, men dette er ikke altid tilfældet. Antallet af brugte bytes pr. tegn afhænger af, hvordan dataene er lagret. For eksempel, hvis strengen er gemt som Unicode-data, vil der være 2 bytes pr. tegn.

Her er et grundlæggende eksempel, der bruger ASCII-tekst (hvor begge funktioner returnerer det samme resultat):

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

Resultat:

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

Og ofte vil vi få det samme resultat, hvis strengen er gemt i en database:

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

Resultat:

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

Men hvis vi ændrer databasekolonnen for at gemme dataene som unicode:

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

Og kør derefter den samme forespørgsel igen:

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

Vi får et andet resultat:

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

Dette skyldes, at unicode gemmer hvert tegn som 2 bytes.

Dette svarer til forskellen mellem datalength() og len() i T-SQL.

MySQL har også octet_length() funktion, som er et synonym for length() .


  1. Proceduren forventer parameter, som ikke blev leveret

  2. Hvad er den bedste måde at vise et billede fra en sql-serverdatabase i asp.net?

  3. RTRIM() Funktion i Oracle

  4. Min BOB-erklæring virker ikke