TANSOT

MySQL i Unicode

25 wrz 2020 137 słów

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 tekst pep🍕peroni zostanie on zapisany jako pep. Aby umożliwić przechowywanie pełnego UTF-8, należy użyć kodowania utf8mb4.

  • 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