V MySQL, OCTET_LENGTH()
Funkce vrací délku řetězce měřenou v bajtech.
Tato funkce je ve skutečnosti synonymem pro LENGTH()
.
Syntaxe
Základní syntaxe vypadá takto:
OCTET_LENGTH(str)
Kde str
je řetězec, pro který chcete vrátit délku.
Příklad
SELECT OCTET_LENGTH('Cat');
Výsledek:
+---------------------+ | OCTET_LENGTH('Cat') | +---------------------+ | 3 | +---------------------+
To je stejný výsledek, jaký bychom dostali, kdybychom použili CHAR_LENGTH()
funkce. Nicméně OCTET_LENGTH()
funkce může vrátit různé výsledky v závislosti na typu dat.
Typy dat
Při dotazu na databázi se zobrazí OCTET_LENGTH()
funkce může vrátit jiný výsledek v závislosti na typu dat. Řetězce Unicode vrátí dvojnásobný počet bajtů. Řetězce UTF-8 se mohou lišit.
Zde je příklad použití UTF-8:
SELECT CHAR_LENGTH(_utf8 '€'), OCTET_LENGTH(_utf8 '€');
Výsledky:
+--------------------------+---------------------------+ | CHAR_LENGTH(_utf8 '€') | OCTET_LENGTH(_utf8 '€') | +--------------------------+---------------------------+ | 1 | 3 | +--------------------------+---------------------------+
V tomto případě je délka znaku 1, ale délka oktetu je 3 bajty.
V následujícím příkladu se dotazujeme na databázi. V tomto případě ArtistName
sloupec používá varchar(255) datový typ:
SELECT OCTET_LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Výsledek tedy vypadá takto:
+--------------------------+ | OCTET_LENGTH(ArtistName) | +--------------------------+ | 3 | +--------------------------+
Pokud však změníme sloupec na ucs2
, každý znak bude reprezentován 2bajtovým kódem Unicode, a proto bude výsledek jiný.
Pro demonstraci můžeme tabulku upravit takto:
SELECT OCTET_LENGTH(ArtistName) ALTER TABLE Artists MODIFY COLUMN ArtistName VARCHAR(255) CHARSET ucs2;
Nyní, když se na to znovu zeptáme:
SELECT OCTET_LENGTH(ArtistName) FROM Artists WHERE ArtistName = 'Lit';
Výsledek:
+--------------------------+ | OCTET_LENGTH(ArtistName) | +--------------------------+ | 6 | +--------------------------+
Koncové mezery
OCTET_LENGTH()
funkce počítá koncové mezery (jako jsou mezery na konci řetězce). Pokud tedy přidáme mezeru na konec prvního příkladu, dostaneme následující výsledek:
SELECT LENGTH('Cat ');
Výsledek:
+----------------+ | LENGTH('Cat ') | +----------------+ | 4 | +----------------+
Hlavní mezery
Stejného výsledku dosáhneme s úvodními mezerami (např. mezerami na začátku řetězce):
SELECT LENGTH(' Cat');
Výsledek:
+----------------+ | LENGTH(' Cat') | +----------------+ | 4 | +----------------+
Pokud samozřejmě nepoužíváme funkci jako TRIM()
, RTRIM()
nebo LTRIM()
pro oříznutí mezer.
Příklad:
SELECT LENGTH(RTRIM('Cat '));
Výsledek:
+-----------------------+ | LENGTH(RTRIM('Cat ')) | +-----------------------+ | 3 | +-----------------------+
Další příklady
Zde je několik příkladů různých řetězců:
SELECT OCTET_LENGTH('Quiet Riot') AS 'Result 1', OCTET_LENGTH('') AS 'Result 2', OCTET_LENGTH('1234 7') AS 'Result 3', OCTET_LENGTH(' ') AS 'Result 4', OCTET_LENGTH(TRIM(' ')) AS 'Result 5';
Výsledek:
+----------+----------+----------+----------+----------+ | Result 1 | Result 2 | Result 3 | Result 4 | Result 5 | +----------+----------+----------+----------+----------+ | 10 | 0 | 7 | 3 | 0 | +----------+----------+----------+----------+----------+
Všimněte si, že výsledky 4 a 5 se liší, protože jsem použil TRIM()
funkce pro oříznutí bílých znaků od výsledku 5. Vzhledem k tomu, že řetězec se skládá pouze z bílých znaků, délka oříznutého řetězce je 0
.
Transact-SQL (pro SQL Server, Azure) má podobnou funkci jako LENGTH()
MySQL a OCTET_LENGTH()
funkcí, ale v T-SQL se to nazývá DATALENGTH()
.