1. Přehled typu ENUM
Co je typ ENUM?
Typ ENUM (enumerace) v MySQL je datový typ, který ukládá přesně jednu hodnotu z předdefinovaného seznamu. Protože lze do sloupce uložit jen konkrétní předdefinované řetězce, zajišťuje to konzistenci dat a zabraňuje vložení neplatných hodnot.
Například když uživatel vybere jednu možnost z omezených možností, jako je pohlaví nebo kategorie produktu, použití typu ENUM eliminuje zbytečnou logiku pro kontrolu chyb. Následuje příklad vytvoření tabulky obsahující sloupec typu ENUM:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('食品', '衣料品', '家電', '家具') NOT NULL
);
V tomto příkladu může sloupec category uložit jen jednu z následujících hodnot: „食品“, „衣料品“, „家電“ nebo „家具“. To pomáhá zjednodušit správu dat a snižuje riziko nesprávného vstupu.
Hlavní případy použití ENUM
Typ ENUM se běžně používá v situacích, jako jsou:
- Správa stavů: Sledování fází pracovního postupu, např. „未開始“, „進行中“ nebo „完了“.
- Definice kategorií: Správa předdefinovaných možností, jako jsou kategorie produktů, typy uživatelů nebo pracovní pozice.
- Skupinování podle hodnocení nebo úrovně: Obtížnost her („初級“, „中級“, „上級“) nebo hodnocení produktů („良い“, „普通“, „悪い“).
2. Výhody a nevýhody ENUM
Výhody
- Zlepšená konzistence dat – ENUM umožňuje jen hodnoty zahrnuté v jeho předdefinovaném seznamu, což zajišťuje jednotnou manipulaci s daty. Například při správě pohlaví jsou povoleny jen definované hodnoty jako „男性“ nebo „女性“, čímž se zabrání neplatným vstupům.
- Efektivní využití úložiště – Každá hodnota ENUM je interně uložena jako celočíselný index. Výsledkem je menší spotřeba úložiště ve srovnání s VARCHAR. Například hodnoty jako „small“ nebo „large“ zabírají více místa jako VARCHAR, ale ENUM je ukládá úsporně pomocí číselných indexů.
Nevýhody
- Nedostatek flexibility – Hodnoty ENUM jsou pevně dané. Přidání nových možností vyžaduje změnu struktury tabulky, což činí ENUM nevhodným pro často se měnící datové sady.
- Komplexní zpracování chyb – Pokud je vložena neplatná hodnota, MySQL může vygenerovat chybu nebo uložit prázdný řetězec. To může komplikovat ladění pro vývojáře.
3. Konfigurace ENUM a praktické použití
Základní nastavení a zpracování chyb
Pro konfiguraci typu ENUM stačí definovat seznam platných řetězců. Následující příklad definuje sloupec ENUM v tabulce:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
Zde sloupec size přijímá jen „XS“, „S“, „M“, „L“ nebo „XL“. Pokus o vložení hodnoty, která není v seznamu (např. „XXL“), vyvolá chybu Data truncated. Tím se zabrání neplatným datům a zachová se konzistence.
Praktický příklad použití
Následující příklad používá ENUM k řízení uživatelských rolí, jako jsou „管理者“, „一般ユーザー“ a „ゲスト“:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('管理者', '一般ユーザー', 'ゲスト') NOT NULL
);
Použití sloupce ENUM usnadňuje udržovat konzistentní oprávnění a řízení na základě rolí.

4. Indexování a práce s NULL u ENUM
Použití indexů
Hodnotám ENUM jsou přiřazeny celočíselné indexy podle jejich pozice v seznamu. Například:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
„S“ má index 1, „M“ index 2 a tak dále. Tyto indexy lze použít ve WHERE klauzulích:
SELECT * FROM products WHERE size = 2;
Tento dotaz vrátí záznamy, kde velikost odpovídá „M“.
Práce s NULL a prázdnými řetězci
Pokud je povoleno NULL, sloupec může uložit NULL jako platný stav, i když není v seznamu ENUM. Navíc neplatná data vložená jako prázdný řetězec jsou uložena s indexem 0, což usnadňuje detekci nesprávných vstupů.
5. Znakové sady a kolace pro ENUM
Jak nastavit znakové sady a kolace
ENUM, podobně jako CHAR nebo VARCHAR, podporuje definice znakové sady a kolace. To je důležité při práci s vícejazyčnými daty nebo řazením. Příklad:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('日本語', '英語', '中国語')
CHARACTER SET utf8
COLLATE utf8_general_ci
);
Tento příklad specifikuje UTF-8 a obecnou kolaci.
6. Rozšíření ENUM a alternativy
Techniky pro rozšíření ENUM
Protože ENUM postrádá flexibilitu pro dynamické hodnoty, můžete zahrnout možnost „Jiné“ a uložit volný vstup do samostatného sloupce:
ALTER TABLE products
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
To umožňuje ukládat hodnoty, které nejsou zahrnuty v seznamu ENUM, a přitom zachovat strukturu.
Alternativní datové typy: SET nebo VARCHAR
V závislosti na požadavcích zahrnují alternativy:
- Typ SET : Ukládá více výběrů ze seznamu.
- VARCHAR : Nabízí maximální flexibilitu bez předdefinovaných omezení.


