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()
.