sql >> Database >  >> RDS >> Mysql

MySQL-lengte() versus char_length()

In MySQL komt het vaak voor dat de length() functie en de char_length() functie geeft exact dezelfde resultaten. Er zijn echter ook momenten waarop de resultaten compleet anders zullen zijn. Dit is waarom.

Ten eerste, hier is de definitie voor elk van deze functies:

char_length()
Retourneert de lengte van een tekenreeks, gemeten in tekens.
length()
Retourneert de lengte van een string, gemeten in bytes.

Let op "tekens" versus "bytes" - één wordt gemeten in tekens , de andere wordt gemeten in bytes .

In veel gevallen zal het aantal bytes gelijk zijn aan het aantal tekens in de string, maar dit is niet altijd het geval. Het aantal bytes dat per teken wordt gebruikt, hangt af van hoe de gegevens zijn opgeslagen. Als de tekenreeks bijvoorbeeld wordt opgeslagen als Unicode-gegevens, zijn er 2 bytes per teken.

Hier is een eenvoudig voorbeeld met ASCII-tekst (waarbij beide functies hetzelfde resultaat opleveren):

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

Resultaat:

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

En vaak krijgen we hetzelfde resultaat als de string is opgeslagen in een database:

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

Resultaat:

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

Als we echter de databasekolom wijzigen om de gegevens als unicode op te slaan:

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

En voer dan dezelfde query opnieuw uit:

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

We krijgen een ander resultaat:

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

Dit komt omdat unicode elk teken opslaat als 2 bytes.

Dit is vergelijkbaar met het verschil tussen datalength() en len() in T-SQL.

MySQL heeft ook de octet_length() functie, wat een synoniem is voor length() .


  1. Fix Toegang geweigerd voor gebruiker 'root'@'localhost' voor phpMyAdmin

  2. Roep een set-retourfunctie met een array-argument meerdere keren aan

  3. SqlBulkCopy invoegen met identiteitskolom

  4. Tips voor het upgraden van MySQL 5.7 naar MySQL 8