Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

Ukládání Unicode Emoji v MySQL databázi

16.10.2019, 09:46

Rozhodli jste se rezignovat na obrázkové smajlíky a napadlo Vás nahradit je Unicode smajlíky? Mě nedávno taktéž a při řešení tohoto úkolu jsem čelil několika problémům, před kterými bych Vás rád varoval.

Na první pohled to zní skvěle, nemusíte se starat o žádné obrázky, smajlíky ve fontu budou pěkně vektoroví, budou všude vypadat pěkně, uživateli se nemusí stahovat další obrázky... prostě samá pozitiva. Skutečnost je ale trochu jiná a ne tak růžová. Unicode Emoji lze sice použít, ale nevyhnete se určitým kompromisům ☹️.

Problém č. 1 - Emoji zmizí

Zkopírujete si nějaký náhodný text obsahující Unicode Emoji a vložíte ho do databáze, do sloupce type TEXT. Jen tak pro začátek, co to vlastně udělá. Překvapení, text byl oříznut před prvním Emoji, ale databáze se tváří spokojeně a žádnou chybu nevrátila. Pokud se Vám přesně toto stalo, pravděpodobně (jako nyní většina z nás) nepoužíváte nejnovější MySQL ale některou z verzí MariaDB. Toto je pro ni typické chování, pokud do sloupce vkládám hodnotu která neodpovídá jeho datovému typu, prostě z ní vezmu co nejvíc, zbytek oříznu a tvářím se jako že nic.

Řešení? Tento problém má naštěstí velmi jednoduché řešení. Pokud nestanovíte jinak, textové sloupce používají 3bitové kódování a Enicode Emoji jsou 4bitový. Stačí tedy jednoduše změnit kódování na utf8mb4, nyní už do sloupce můžete vesele ukládat Unicode Emoji.


Problém č. 2 - Zobrazí se jen některé

Výborně, do databáze si nyní uložíte všemožné smajlíky (a že jich je) a zkusíte si je vypsat na stránce. Pokud jste neměli zrovna šťastnou ruku při výběru, spousta z nich se Vám vůbec nevypíše. Databáze totiž nepodporuje všechny existující emoji, uložit jich lze jen (poměrně malou) podmnožinu. Jak vidíte níže, bohužel zrovna ty nejdůležitější (klasické smajlíky) v ní chybí. V době psaní tohoto článku podporovala databáze pouze tyto:

✂️⤵️ ☺️☹️ ✊ ✌✋☝️ ✍❤️⛑ ⛹☘⭐️ ✨ ☄ ☀️ ⛅️ ☁️ ⛈ ⚡️ ❄️ ❄️ ☃ ⛄️ ☂ ☔️ ☕️ ⚽️ ⚾️ ⛳️ ⛷ ⛸ ⛹ ✈️ ⛵️ ⛴ ⚓️ ⛽️ ⛲️ ⛰ ⛺️ ⛪️ ⛩ ⌚️ ⌨ ☎️ ⏱ ⏲ ⏰ ⏳ ⌛️ ⚖ ⚒ ⛏ ⚙ ⛓ ⚔ ☠ ⚰ ⚱ ⚗ ⛱ ✉️ ✂️ ✒️ ✏️ ❤️ ❣ ☮ ✝ ☪ ☸ ✡ ☯ ☦ ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ ⚛ ☢ ☣️ ✴️ ㊙️ ㊗️ ⛔️ ❌ ⭕️ ♨️ ❗️ ❕ ❓ ❔ ‼️ ⁉️ ⚜ 〽️ ⚠️ ♻️ ❇️ ✳️ ❎ ✅ ➿ Ⓜ️ ♿️ 0⃣ 1⃣ 2⃣ 3⃣ 4⃣ 5⃣ 6⃣ 7⃣ 8⃣ 9⃣ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ◀️ ⏫ ⏬ ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ #⃣ *⃣ ℹ️ 〰 ➰ ✔️ ➕ ➖ ➗ ✖️ © ® ™ ☑️ ⚪️ ⚫️ ▪️ ▫️ ⬛️ ⬜️ ◼️ ◻️ ◾️ ◽️ ♠️ ♣️ ♥️ ♦️‍ ☺️ ☝️ ✌ ✍ ❤️ ❣ ☠ ♨️ ✈️ ⌛️ ⌚️ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ ☀️ ☁️ ☂ ❄️ ⛄️ ☄ ♠️ ♥️ ♦️ ♣️ ▶️ ◀️ ☎️ ⌨ ✉️ ✏️ ✒️ ✂️ ↗️ ➡️ ↘️ ↙️ ↖️ ↕️ ↔️ ↩️ ↪️ ✡ ☸ ☯ ✝ ☦ ☪ ☮ ☢ ☣ ☑️ ✔️ ✖️ ✳️ ✴️ ❇️ ‼️ © ® ™ Ⓜ️ ▪️ ▫️ #⃣ *⃣ 0⃣ 1⃣ 2⃣ 3⃣ 4⃣ 5⃣ 6⃣ 7⃣ 8⃣ 9⃣ ⁉️ ℹ️ ⤴️ ⤵️ ♻️ ◻️ ◼️ ◽️ ◾️ ☕️ ⚠️ ☔️ ⏏ ⬆️ ⬇️ ⬅️ ⚡️ ☘ ⚓️ ♿️ ⚒ ⚙ ⚗ ⚖ ⚔ ⚰ ⚱ ⚜ ⚛ ⚪️ ⚫️ ⭐️ ⬛️ ⬜️ ⛑ ⛰ ⛪️ ⛲️ ⛺️ ⛽️ ⛵️ ⛴ ⛔️ ⛅️ ⛈ ⛱ ⛄️ ⚽️ ⚾️ ⛳️ ⛸ ⛷ ⛹ ⛏ ⛓ ⛩ ⭕️ ❗️ ❦ ♕ ♛ ♔ ♖ ♜ ☾ → ⇒ ⟹ ⇨ ⇰ ➩ ➪ ➫ ➬ ➭ ➮ ➯ ➲ ➳ ➵ ➸ ➻ ➺ ➼ ➽ ☜ ☟ ➹ ➷ ↶ ↷ ✆ ⌘ ⎋ ⏎ ⏏ ⎈ ⎌ ⍟ ❥ ツ ღ ☻

Řešení? Žádné není. Respektive, zde nastupuje kompromis o kterém jsem se zmiňoval na začátku a detailněji ho vysvětlím na konci, u popisu mého řešení.

Problém č. 3 - Na některých zařízení se Emoji nezobrazí

Řěkněme že předchozí problémy jste vyřešili a začali jste Unicode Emoji využívat. Brzy se Vám ale ozvou uživatelé, že místo pěkných nových smajlíků vidí jen nějaké černé obludy, nebo hůře, nevidí vůbec nic. Jakto? Vždyť jste to otestovali na všem co bylo po ruce, a přestože to na různých systémech vypadalo trochu odlišně, vždy to bylo dobré a použitelné.

Unicode smajlíky fungují pěkně ve všech prohlížečích na Androidu, na iOS a nejspíš i všech Windows které jste zkoušeli. Začnete tedy zpovídat uživatele, jaký že to mají prohlížeč. Brzy zjistíte že prohlížečem to není a tak se zaměříte na systém. Pak se objeví viník a není jím nikdo jiný než Windows 7. Ale jakto, Windows 7 jste zkoušeli a vše bylo v pořádku. Ano, na Vašem aktualizovaném Windows 7 není problém. Na konci roku 2018 došlo do Win 7 aktualizace, která do systému dodala font Segoe UI symbol, který je zodpovědný za Unicode Emoji. Bez této aktualizace je Windows 7 nebude umět zobrazit.

Řešení? Opět víceméně žádné není. V dalším odstavci Vám povím jak jsem k tomu přistoupil já.


Aktuálně jedině kompromis

V současnosti lze řešit situace jedině jedním velkým kompromisem. Problém s Windows 7 je neřešitelný (z licenčních důvodů není možné daný font includnout do stránky na serveru) a jediná možnost tak je odstřihnout uživatele Win 7 od nových smajlíků. Mohli byste jim programově nahrazovat Unicode Emoji obrázky, ale pak to celé ztrácí smysl.

V mém případě šlo celkově o 11% uživatelů Windows 7 (s ročním poklesem 4%). Kolik z nich má potřebnou aktualizaci jednoduše zjistit nejde. Na internetu jsem našel informace o tom, že 2/3 uživatelů aktualizují. Z toho vychází že problém by mohlo mít maximálně 4% ze všech uživatelů, přičemž toto číslo bude neustále klesat. Emoji nejsou žádná klíčová funkce a 4% není moc, rozhodl jsem se tedy tento problém neřešit a tento zlomek uživatelů si tedy zatím nové Emoji neužije.

Problém s uložením v databázi jsem už ale řešit musel. Ze smajlíků, které jsem chtěl použít šel přímo uložit v databázi pouze jediný. Před přechodem na Unicode Emoji jsem využíval obrázkové smajlíky. V databázi byly uloženy textově (ve znakové formě, tedy :-), :-( atd.) a při výpisu se programově nahrazovali, při ukládání zase naopak. Jediná změna, kterou jsem provedl bylo v programovém nahrazování, kdy textové vyjádření nahrazují Unicode znakem místo předchozího obrázku.

V mém případě tedy nebyly potřeba vůbec žádné změny v databázi a jen malá úprava kódu v nahrazování textu smajlíkem. Bohužel, na žádné lepší, elegantnější a funkční řešení jsem aktuálně nepřišel. Windows 7 bude menší a menší problém, ale dokud některá z další verzí MySQL/MariaDB nezačne více podporovat Unicode Emoji, o moc lépe to nepůjde ☹️.


Štítky: #databaze   #emoji