- 1 1. Úvod
- 2 2. Základní znalosti práce s poli v MySQL JSON
- 3 3. Základní operace s JSON polem
- 4 4. Vyhledávání a filtrování JSON polí
- 5 5. Praktické příklady: Použití JSON polí v reálných situacích
- 6 6. Důležité úvahy při používání datového typu JSON
- 7 7. Často kladené otázky o používání polí v MySQL
- 8 8. Summary
1. Úvod
Potřeba pracovat s polemi v MySQL
Databáze obvykle ukládají data podle principů relačního návrhu. Nicméně v závislosti na požadavcích aplikace se mohou objevit situace, kdy chcete uložit více hodnot do jednoho sloupce. V takových případech je užitečná datová struktura podobná „pole“.
Například uvažujte následující scénáře:
- Ukládání více štítků vybraných uživatelem.
- Ukládání více URL obrázků pro produkt.
- Kombinování historie nebo logů do jednoho pole.
Výhody použití datového typu JSON
MySQL neposkytuje přímý „typ pole“, ale pomocí datového typu JSON můžete pracovat s datovými strukturami podobnými polím. Typ JSON je vysoce flexibilní a nabízí následující výhody:
- Podporuje vnořené datové struktury.
- Umožňuje snadnou manipulaci s daty v dotazech.
- Umožňuje správu více datových formátů v jednom sloupci.
V tomto článku představíme, jak efektivně pracovat s polemi v MySQL pomocí datového typu JSON.
2. Základní znalosti práce s poli v MySQL JSON
Co je datový typ JSON?
JSON (JavaScript Object Notation) je lehký a jednoduchý formát pro výměnu dat. V MySQL byl nativní podporu JSON zaveden v verzi 5.7 a novější, což umožňuje ukládat a manipulovat s JSON‑formátovanými daty přímo v databázi.
Příklad: Níže je ukázka dat, která lze uložit do sloupce typu JSON.
{
"tags": ["PHP", "MySQL", "JSON"],
"status": "published"
}
Výhody a případy použití datového typu JSON
Hlavní výhody použití typu JSON jsou následující:
- Flexibilní datová struktura: Můžete pracovat s daty proměnné délky, aniž byste museli měnit relační schéma.
- Efektivní manipulace s daty: Data lze snadno upravovat pomocí specializovaných funkcí MySQL (např.
JSON_EXTRACT,JSON_ARRAY). - Design bez schématu: Není nutné často měnit schéma, když se mění požadavky aplikace.
Příklady použití:
- Přiřazení více kategorií k informacím o produktu.
- Ukládání vlastních nastavení uživatele.
- Použití vnořených JSON dat ve webových aplikacích.
3. Základní operace s JSON polem
Vytvoření JSON pole
V MySQL můžete snadno vytvořit JSON pole pomocí funkce JSON_ARRAY. Pole jsou užitečná, když chcete v jednom sloupci uložit více hodnot.
Příklad
Následující dotaz vytvoří JSON pole s názvem tags.
SELECT JSON_ARRAY('PHP', 'MySQL', 'JavaScript') AS tags;
Výsledek:
["PHP", "MySQL", "JavaScript"]
Praktický příklad
Následující příklad ukazuje, jak uložit JSON pole do databáze pomocí příkazu INSERT.
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
tags JSON
);
INSERT INTO articles (tags)
VALUES (JSON_ARRAY('PHP', 'MySQL', 'JavaScript'));
Extrakce dat z JSON pole
Pro získání dat uložených v JSON poli použijte funkci JSON_EXTRACT. Tato funkce umožňuje snadno vyjmout konkrétní prvky z pole.
Příklad
Následující příklad získá druhý prvek v poli (indexování začíná od 0).
SELECT JSON_EXTRACT('["PHP", "MySQL", "JavaScript"]', '$[1]') AS second_tag;
Výsledek:
"MySQL"
Získání více prvků najednou
Můžete také získat více prvků najednou.
SELECT JSON_EXTRACT('["PHP", "MySQL", "JavaScript"]', '$[0]', '$[2]') AS extracted_values;
Přidávání, aktualizace a odstraňování dat
Přidání dat do pole
Nová data můžete přidat do existujícího pole pomocí funkce JSON_ARRAY_APPEND.
SET @tags = '["PHP", "MySQL"]';
SELECT JSON_ARRAY_APPEND(@tags, '$', 'JavaScript') AS updated_tags;
Výsledek:
["PHP", "MySQL", "JavaScript"]
Aktualizace dat v poli
Data v konkrétním prvku pole můžete aktualizovat pomocí funkce JSON_SET.
SET @tags = '["PHP", "MySQL", "JavaScript"]';
SELECT JSON_SET(@tags, '$[1]', 'Python') AS updated_tags;
Výsledek:
["PHP", "Python", "JavaScript"]
Odstranění dat z pole
Můžete odstranit konkrétní prvek z pole pomocí funkce JSON_REMOVE.
SET @tags = '["PHP", "MySQL", "JavaScript"]';
SELECT JSON_REMOVE(@tags, '$[1]') AS updated_tags;
Výsledek:
["PHP", "JavaScript"]
4. Vyhledávání a filtrování JSON polí
Vyhledávání polí obsahujících konkrétní data
Pro kontrolu, zda JSON pole obsahuje konkrétní data, použijte funkci JSON_CONTAINS. Tato funkce určuje, zda zadaná hodnota existuje v JSON poli.
Příklad
Následující příklad kontroluje, zda JSON pole obsahuje „MySQL“.
SELECT JSON_CONTAINS('["PHP", "MySQL", "JavaScript"]', '"MySQL"') AS is_present;
Výsledek:
1 (if present)
0 (if not present)
Praktický příklad: podmíněné vyhledávání
Pro vyhledání řádků obsahujících konkrétní hodnotu v JSON poli v databázové tabulce použijte JSON_CONTAINS ve WHERE klauzuli.
SELECT *
FROM articles
WHERE JSON_CONTAINS(tags, '"MySQL"');
Tento dotaz vrátí řádky, kde sloupec tags obsahuje „MySQL“.
Získání délky pole
Pro získání počtu prvků v JSON poli použijte funkci JSON_LENGTH. Tato funkce vrací počet prvků v poli a je užitečná pro analýzu dat a podmíněnou logiku.
Příklad
Následující příklad získá počet prvků v poli.
SELECT JSON_LENGTH('["PHP", "MySQL", "JavaScript"]') AS array_length;
Výsledek:
3
Praktický příklad: extrahování řádků splňujících konkrétní podmínku
Pro extrahování řádků, kde je počet prvků větší nebo roven konkrétní hodnotě, použijte JSON_LENGTH ve WHERE klauzuli.
SELECT *
FROM articles
WHERE JSON_LENGTH(tags) >= 2;
Tento dotaz vrátí řádky, kde sloupec tags obsahuje dva nebo více prvků.
Pokročilý příklad podmíněného dotazu
Můžete kombinovat více podmínek pro pokročilejší vyhledávání. Následující dotaz hledá řádky, kde pole tags obsahuje „JavaScript“ a má tři nebo více prvků.
SELECT *
FROM articles
WHERE JSON_CONTAINS(tags, '"JavaScript"')
AND JSON_LENGTH(tags) >= 3;
5. Praktické příklady: Použití JSON polí v reálných situacích
Jak uložit kategorie produktů jako JSON pole
Na e‑commerce stránkách a podobných systémech může produkt patřit do více kategorií. V takových případech můžete efektivně ukládat informace o kategoriích pomocí JSON pole.
Příklad: ukládání dat kategorií produktu
Níže je příklad vytvoření JSON sloupce s názvem categories v tabulce produktů a uložení více kategorií.
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
categories JSON
);
INSERT INTO products (name, categories)
VALUES ('Laptop', JSON_ARRAY('Electronics', 'Computers')),
('Smartphone', JSON_ARRAY('Electronics', 'Mobile Devices'));
Tato struktura udržuje data stručná i když produkt patří do více kategorií.
Dotaz pro extrahování produktů v konkrétní kategorii
Využitím typu dat JSON můžete snadno vyhledávat produkty, které patří do konkrétní kategorie.
Příklad dotazu
Následující dotaz získá všechny produkty v kategorii „Electronics“.
SELECT name
FROM products
WHERE JSON_CONTAINS(categories, '"Electronics"');
Výsledek:
Laptop
Smartphone
Tento dotaz usnadňuje flexibilní získávání seznamů produktů podle kategorií.
Příklad: filtrování podle cenového rozpětí
Podívejme se, jak uložit JSON data obsahující informace o cenách a poté vyhledávat produkty podle cenového rozpětí.
Příklad dat
The following example stores price information per product using the JSON type.
CREATE TABLE products_with_prices (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
details JSON
);
INSERT INTO products_with_prices (name, details)
VALUES ('Laptop', '{"price": 150000, "categories": ["Electronics", "Computers"]}'),
('Smartphone', '{"price": 80000, "categories": ["Electronics", "Mobile Devices"]}');
Příklad dotazu
Chcete-li vyhledat produkty s cenou 100 000 a více, použijte funkci JSON_EXTRACT.
SELECT name
FROM products_with_prices
WHERE JSON_EXTRACT(details, '$.price') >= 100000;
Výsledek:
Laptop
Rozšíření JSON pomocí JSON_TABLE a příklad dotazu
Pokud chcete dotazovat JSON data v relačním formátu, funkce JSON_TABLE je velmi užitečná. Tato funkce vám umožní rozšířit JSON pole do virtuální tabulky.
Příklad
Následující příklad rozšiřuje JSON pole a zobrazuje každou kategorii jako samostatný řádek.
SELECT *
FROM JSON_TABLE(
'["Electronics", "Computers", "Mobile Devices"]',
'$[*]' COLUMNS(
category_name VARCHAR(100) PATH '$'
)
) AS categories_table;
Výsledek:
category_name
--------------
Electronics
Computers
Mobile Devices

6. Důležité úvahy při používání datového typu JSON
Tipy pro optimalizaci výkonu
Ačkoliv je typ JSON flexibilní, špatný návrh může negativně ovlivnit výkon databáze. Níže jsou klíčové body optimalizace.
1. Používání indexů
V MySQL nelze vytvořit index přímo na sloupci typu JSON, ale můžete vytvořit generovaný sloupec a indexovat konkrétní klíč.
Příklad: Vytvoření indexu pomocí generovaného sloupce
V následujícím příkladu je klíč price uvnitř JSON dat použit jako cíl indexu.
ALTER TABLE products_with_prices
ADD COLUMN price INT AS (JSON_EXTRACT(details, '$.price')) STORED,
ADD INDEX idx_price (price);
Použitím generovaného sloupce můžete výrazně zlepšit výkon vyhledávání v JSON datech.
2. Vyhněte se příliš složitým strukturám JSON
Hlouběji vnořené struktury JSON mohou snížit čitelnost dotazů a výkon. Při návrhu dat zvolte co nejjednodušší strukturu JSON.
Dobrá ukázka:
{
"categories": ["Electronics", "Computers"],
"price": 150000
}
Příklad, kterému se vyhnout:
{
"product": {
"details": {
"price": 150000,
"categories": ["Electronics", "Computers"]
}
}
}
Jak využít indexy
Při indexování pomocí generovaných sloupců mějte na paměti následující body:
- Generovaný sloupec musí být
STORED. - Použijte funkci
JSON_EXTRACTk extrahování konkrétního klíče jako generovaný sloupec.
Například, chcete-li extrahovat první prvek klíče categories a vytvořit index, proveďte následující.
ALTER TABLE products
ADD COLUMN main_category VARCHAR(255) AS (JSON_EXTRACT(categories, '$[0]')) STORED,
ADD INDEX idx_main_category (main_category);
Důležitost validace dat
Protože jsou JSON data flexibilní, je také snazší uložit data ve špatném formátu. Pro zachování integrity dat použijte následující přístupy.
1. Použijte CHECK omezení
V MySQL 8.0 a novějších můžete validovat strukturu a obsah JSON pomocí omezení CHECK.
ALTER TABLE products_with_prices
ADD CONSTRAINT check_price CHECK (JSON_EXTRACT(details, '$.price') >= 0);
2. Validace na úrovni aplikace
Při vkládání dat se doporučuje validovat formát JSON na straně aplikace. Programovací jazyky jako PHP a Python mohou validovat JSON pomocí svých standardních knihoven.
7. Často kladené otázky o používání polí v MySQL
Q1: Má MySQL datový typ pole?
A1: MySQL nemá přímý „typ pole“. Nicméně pomocí typu JSON můžete pracovat s datovými strukturami podobnými poli. S typem JSON můžete uložit více hodnot do jednoho sloupce a manipulovat s nimi pomocí dotazů.
Example:
SELECT JSON_ARRAY('Value 1', 'Value 2', 'Value 3') AS array_example;
Result:
["Value 1", "Value 2", "Value 3"]
Q2: Can you create an index on JSON data?
A2: Nemůžete vytvořit index přímo na typu JSON. Můžete však extrahovat konkrétní klíč nebo hodnotu do generovaného sloupce a vytvořit index na tomto generovaném sloupci.
Example:
ALTER TABLE products_with_prices
ADD COLUMN price INT AS (JSON_EXTRACT(details, '$.price')) STORED,
ADD INDEX idx_price (price);
Tímto umožníte efektivní vyhledávání hodnot uvnitř JSON dat.
Q3: Is there a size limit for JSON data?
A3: Typ JSON v MySQL může uložit až 4 GB dat. Používání extrémně velkých JSON dokumentů však může snížit výkon, takže byste měli navrhovat svá data opatrně.
Recommendations:
- Ukládejte pouze minimální potřebná data.
- Vyhněte se hluboce vnořeným strukturám JSON.
Q4: How can I update a specific element inside a JSON array?
A4: Můžete aktualizovat konkrétní prvek v poli pomocí funkce JSON_SET.
Example:
SET @tags = '["PHP", "MySQL", "JavaScript"]';
SELECT JSON_SET(@tags, '$[1]', 'Python') AS updated_tags;
Result:
["PHP", "Python", "JavaScript"]
Q5: Comparing the JSON Type vs. Normal Table Design
A5: Zatímco typ JSON je vysoce flexibilní, má jiné charakteristiky než tradiční relační databázový design.
| Item | JSON Type | Traditional Table Design |
|---|---|---|
| Flexibility | High (no schema changes needed) | Fixed (schema changes required) |
| Performance | Inferior for some operations | Optimized |
| Query Complexity | Requires JSON functions | Simple |
| Indexing | Partially supported via generated columns | Fully supported |
8. Summary
Benefits of Using the JSON Data Type for Array Operations in MySQL
In this article, we explained the JSON data type, which is helpful when working with array-like data in MySQL. Below is a summary of the key points covered:
- Why Use the JSON Type MySQL does not have a direct array type, but by using the JSON type, you can store multiple values in one column and achieve flexible data manipulation.
- Basic JSON Operations
- We covered how to create JSON arrays, extract data, update data, and remove data.
- By using convenient functions such as
JSON_ARRAY,JSON_EXTRACT, andJSON_SET, you can efficiently manipulate array data.
- Search and Filtering
- How to search for data containing specific values using
JSON_CONTAINS. - How to retrieve the number of elements with
JSON_LENGTHand perform conditional filtering.
- Practical Examples Through real-world use cases such as managing product categories and filtering by price, we learned concrete ways to apply JSON arrays in applications.
- Considerations and Optimization
- We explained how to set up indexing using generated columns and emphasized the importance of validating JSON data.
Next Steps When Using the JSON Data Type
By using the JSON type in MySQL, you can manage data more flexibly than in traditional relational database designs. However, good design and performance considerations are essential.
Topics to Learn Next:
- Using Composite Indexes Index design that combines JSON data with normal columns.
- Using Advanced JSON Functions Perform more complex operations with functions such as
JSON_MERGEandJSON_OBJECT. - Application-Level Data Handling How to efficiently manipulate MySQL JSON data using PHP or Python.
Summary
Through this article, you should now understand how to efficiently handle array-like data using MySQL’s JSON data type. By applying this knowledge, you can design more flexible and scalable databases.


