MySQL i Unicode
Tytułowe combo bywa problematyczne z kilku względów:
-
Jeśli intuicyjnie wybierzemy kodowanie
utf8
, to MySQL będzie ucinać ciągi tekstowe na znakach, które w UTF-8 są kodowane jako cztery bajty. Należą do nich m. in. emojis. Przykładowo wrzucając do bazy tekstpep🍕peroni
zostanie on zapisany jakopep
. Aby umożliwić przechowywanie pełnego UTF-8, należy użyć kodowaniautf8mb4
. -
Istotny jest wybór nie tylko kodowania znaków, ale też tzw. collation, czyli sposobu porównywania ciągów.
utf8mb4_unicode_ci
nie radzi sobie z rozróżnianiem emojis, w efekcie czego znaki 🍕 i 🍍 zostają uznane za identyczne (ocenę czy w tym przypadku to bug, czy feature, pozostawiam odbiorcy). Lepiej użyć np.utf8mb4_unicode_520_ci
.
Jeśli używamy Symfony z Doctrine Migrations, to domyślne kodowanie i collation można zmienić w konfiguracji, jednak to ustawienie będzie się tyczyć jedynie nowo tworzonych migracji:
doctrine:
dbal:
...
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_520_ci