sql >> Databasteknik >  >> RDS >> Mysql

MySQL length() vs char_length()

I MySQL finns det många gånger där length() funktion och char_length() funktionen ger exakt samma resultat. Men det finns också tillfällen då resultaten blir helt annorlunda. Här är varför.

Först, här är definitionen för var och en av dessa funktioner:

char_length()
Returnerar längden på en sträng, mätt i tecken.
length()
Returnerar längden på en sträng, mätt i byte.

Lägg märke till "tecken" vs "byte" - en mäts i tecken , den andra mäts i byte .

I många fall kommer antalet byte att vara detsamma som antalet tecken i strängen, men detta är inte alltid fallet. Antalet byte som används per tecken beror på hur data lagras. Till exempel, om strängen lagras som Unicode-data, kommer det att finnas 2 byte per tecken.

Här är ett grundläggande exempel med ASCII-text (där båda funktionerna returnerar samma resultat):

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

Resultat:

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

Och ofta får vi samma resultat om strängen lagras i en databas:

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

Resultat:

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

Men om vi ändrar databaskolumnen för att lagra data som unicode:

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

Och kör sedan samma fråga igen:

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

Vi får ett annat resultat:

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

Detta beror på att unicode lagrar varje tecken som 2 byte.

Detta liknar skillnaden mellan datalength() och len() i T-SQL.

MySQL har också octet_length() funktion, som är en synonym för length() .


  1. Hur man returnerar en lista över språk som stöds i Oracle

  2. Få storleken på en databas i MariaDB

  3. Java - hitta den första orsaken till ett undantag

  4. Returnera en lista över alla serverutlösare i SQL Server