sql >> Databáze >  >> RDS >> Mysql

Jak funguje funkce OCTET_LENGTH() v MySQL

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


  1. Rails:Žádný fond připojení pro ActiveRecord::Base

  2. Resetujte primární klíč PostgreSQL na 1

  3. Jak vložit více řádků do MySQL

  4. Jak zjistit a zabránit neočekávanému nárůstu SQL Server databáze TempDB