1. Přehled datového typu ENUM
Co je datový typ ENUM?
Datový typ MySQL ENUM (enumerace) ukládá přesně jednu hodnotu z předdefinovaného seznamu. Protože v sloupci lze uložit jen konkrétní řetězce definované v seznamu, pomáhá udržovat konzistenci dat a zabraňuje zadávání neplatných údajů.
Například když uživatelé musí vybrat jednu možnost z omezené sady, jako je pohlaví nebo kategorie produktu, použití ENUM eliminuje potřebu zbytečných validačních kontrol. Níže je příklad vytvoření tabulky, která obsahuje sloupec typu ENUM:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('Food', 'Clothing', 'Electronics', 'Furniture') NOT NULL
);
V tomto příkladu může sloupec „category“ uložit jen jednu ze čtyř následujících hodnot: „Food“, „Clothing“, „Electronics“ nebo „Furniture“. To zjednodušuje správu dat a snižuje riziko nesprávného vstupu.
Hlavní případy použití ENUM
Datový typ ENUM se primárně používá v následujících situacích:
- Správa stavů : Enumerace stavů postupu projektu, jako jsou „Not Started“, „In Progress“ a „Completed“.
- Kategorizace : Správa předdefinovaných možností kategorií, jako jsou produkty, typy uživatelů nebo pracovní role.
- Hodnocení : Úrovně obtížnosti hry („Beginner“, „Intermediate“, „Advanced“) nebo hodnocení produktů („Good“, „Average“, „Poor“).
2. Výhody a nevýhody ENUM
Výhody
- Zlepšená integrita dat S ENUM lze uložit jen hodnoty zahrnuté v předdefinovaném seznamu, což zajišťuje konzistenci dat a usnadňuje správu. Například při správě pohlaví jsou povoleny jen konkrétní hodnoty jako „Male“ nebo „Female“, což zabraňuje nesprávnému vstupu.
- Účinnost úložiště Každá hodnota ENUM je interně přiřazena k celočíselnému indexu, takže hodnoty jsou uloženy jako celá čísla. Ve srovnání s VARCHAR to snižuje využití úložiště. Například ukládání informací o velikosti jako „small“ nebo „large“ pomocí VARCHAR spotřebuje více místa, zatímco definování těchto hodnot pomocí ENUM umožňuje efektivnější ukládání.
Nevýhody
- Nedostatek flexibility Protože ENUM umožňuje jen předdefinované hodnoty, přidání nových hodnot vyžaduje změnu struktury tabulky. Proto není vhodný pro scénáře, kde se možnosti často dynamicky mění.
- Komplexní zpracování chyb Pokud je vložena neplatná hodnota, může dojít k chybě nebo může být uložena prázdná řetězcová hodnota. Toto chování může komplikovat ladění pro vývojáře.
3. Konfigurace a příklady použití ENUM
Základní nastavení a zpracování chyb
Nastavení datového typu ENUM jednoduše zahrnuje specifikaci seznamu povolených řetězců. Níže je příklad definování sloupce typu ENUM v tabulce:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
V tomto případě může sloupec „size“ uložit jen jednu z pěti hodnot: „XS“, „S“, „M“, „L“ nebo „XL“. Pokud se pokusíte vložit hodnotu, která není v seznamu (například „XXL“), dojde k chybě Data truncated. To zabraňuje ukládání hodnot mimo předdefinovaný seznam a pomáhá udržovat konzistenci dat.
Praktický příklad
Níže je příklad použití ENUM pro správu uživatelských rolí („Administrator“, „Regular User“, „Guest“):
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('Administrator', 'Regular User', 'Guest') NOT NULL
);
Při přiřazování různých oprávnění na základě rolí usnadňuje použití sloupce typu ENUM udržování integrity dat.

4. Indexy ENUM a zpracování NULL
Použití indexových hodnot
Každé hodnotě ENUM je přiřazen číselný index počínaje 1 podle její pozice v seznamu. Například uvažujme následující sloupec ENUM ukládající informace o velikosti:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
„S“ má přiřazený index 1, „M“ index 2 a tak dále. Tyto hodnoty indexu lze také použít ve WHERE podmínkách pro efektivní operace s daty.
SELECT * FROM products WHERE size = 2;
Tento dotaz načte záznamy, kde je velikost „M“.
Zpracování NULL a prázdných řetězců
Pokud je v sloupci ENUM povoleno NULL, mohou být hodnoty NULL uloženy i když nejsou součástí předdefinovaného seznamu. Navíc, pokud jsou vložena neplatná data a převedena na prázdný řetězec, jsou uložena s indexem 0. Toto chování umožňuje detekovat nesprávný vstup.
5. Sady znaků a kolace v ENUM
Jak nastavit sady znaků a kolace
Stejně jako CHAR a VARCHAR, typ dat ENUM umožňuje specifikovat sadu znaků a kolaci. To je zvláště důležité při tvorbě vícejazykových systémů nebo provádění vyhledávání, která závisí na pravidlech kolace. Níže je příklad:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('Japanese', 'English', 'Chinese') CHARACTER SET utf8 COLLATE utf8_general_ci
);
V tomto příkladu je specifikována sada znaků UTF-8 a obecná kolace.
6. Rozšiřitelnost a alternativy k ENUM
Strategie pro rozšíření ENUM
Protože ENUM postrádá flexibilitu pro ukládání libovolných hodnot, není vhodný pro data, která se dynamicky mění. Jedním přístupem je přidat možnost „Jiné“ a poskytnout samostatný sloupec pro volný text:
ALTER TABLE products
MODIFY COLUMN category ENUM('Food', 'Clothing', 'Electronics', 'Furniture', 'Other') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
Tímto způsobem lze hodnoty, které nejsou zahrnuty v seznamu ENUM, uložit do samostatného sloupce VARCHAR, což umožňuje dynamické zpracování podle potřeby.
Použití SET nebo VARCHAR jako alternativ
Jako alternativy k ENUM můžete zvážit typ dat SET (který umožňuje více výběrů) nebo flexibilnější typ VARCHAR, v závislosti na požadavcích vaší aplikace.


