Jaka jest różnica między utf8 a utf8mb4 w MySQL?

Kodowanie znaków jest podstawą sposobu, w jaki dane są przechowywane, zapytane i renderowane w nowoczesnych aplikacjach oraz środowiskach hostingowych. Jeśli prowadzisz stronę internetową lub aplikację internetową na wspólnym hostingu, VPS lub serwerze dedykowanym zasilanym przez MySQL lub MariaDB, prawdopodobnie spotkałeś się z terminami utf8 i utf8mb4. Na pierwszy rzut oka wydają się one synonimiczne—oba reprezentują kodowania Unicode. Ale pod maską istnieje krytyczna różnica, która może wpłynąć na zdolność Twojej aplikacji do przechowywania nowoczesnych danych tekstowych, takich jak emoji, treści wielojęzyczne lub niektóre znaki CJK (chińskie, japońskie, koreańskie)—szczególnie w zglobalizowanych lub wielojęzycznych rozwiązaniach hostingowych.

Definicje

utf8

  • Dziedziczne kodowanie Unicode MySQL.

  • Obsługuje tylko 3 bajty na znak.

  • Może przechowywać znaki w Podstawowej Płaszczyźnie Wielojęzycznej (BMP): U+0000 do U+FFFF.

  • Nie może przechowywać emoji, symboli muzycznych, niektórych znaków chińskich i innych znaków uzupełniających.

utf8mb4 (Multi-Byte 4)

  • Prawdziwa implementacja UTF-8.

  • Obsługuje pełny Unicode, w tym znaki poza BMP.

  • Używa do 4 bajtów na znak—tak jak zaprojektowano UTF-8.

  • Wymagane do przechowywania emoji (😊), rzadkich znaków chińskich (𠀋) lub symboli matematycznych (𝛑).

Mylące utf8 w MySQL

W MySQL zestaw znaków utf8 nie jest pełną implementacją standardu UTF-8. Jest ograniczony do 3 bajtów, podczas gdy standardowy UTF-8 używa do 4 bajtów. To oznacza:

  • utf8 w MySQL nie jest prawdziwym UTF-8.

  • Jest bardziej jak podzbiór UTF-8, który wyklucza punkty kodowe poza U+FFFF.

W przeciwieństwie do tego, utf8mb4 w pełni spełnia standard UTF-8.

Porównanie techniczne

Cechyutf8utf8mb4
Maks. bajty na znak34
Pokrycie UnicodeDo U+FFFF (tylko BMP)Pełny zakres (do U+10FFFF)
Wsparcie dla emoji❌ Nie✅ Tak
Wsparcie dla znaków uzupełniających❌ Nie✅ Tak
Kompatybilność z MySQL✅ Bezpieczne dla dziedzictwa✅ Pełny Unicode
Opcje porównaniaOgraniczoneBardziej rozbudowane (np. utf8mb4_0900_ai_ci)

Dlaczego utf8mb4 jest właściwym wyborem

1. Wsparcie dla emoji i nowoczesnych symboli

Nie możesz przechowywać 🐱, 🧠, 🚀 lub 🇩🇪 używając utf8 MySQL. Te są poza BMP.

2. Lepsze porównanie i sortowanie

utf8mb4 obsługuje nowsze porównania, takie jak:

  • utf8mb4_unicode_ci: Sortowanie zgodne ze standardem Unicode

  • utf8mb4_general_ci: Szybkie, ale mniej dokładne

  • utf8mb4_0900_ai_ci: Nowoczesne porównanie świadome Unicode 9.0 (dostępne w MySQL 8+)

3. Przyszłościowe zabezpieczenie

W miarę jak Unicode się rozwija, nowsze znaki będą wypadać poza zakres 3 bajtów. utf8mb4 zapewnia, że nie zostaniesz zablokowany przed przyszłymi symbolami.

Co się stanie, jeśli użyjesz utf8?

Jeśli spróbujesz wstawić znak 4-bajtowy (taki jak emoji) do kolumny z+, otrzymasz ten błąd:

ERROR 1366 (HY000): Incorrect string value: 'xF0x9Fx98x81' for column 'title' at row 1

Co gorsza, Twoja aplikacja może cicho obciąć lub uszkodzić dane, jeśli nie zostaną odpowiednio zweryfikowane.

Migracja z utf8 do utf8mb4

Aby bezpiecznie migrować swój schemat:

Krok 1: Zaktualizuj definicje tabel i kolumn

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Krok 2: Zaktualizuj domyślne ustawienia bazy danych

ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Krok 3: Zaktualizuj ustawienia połączenia aplikacji

Upewnij się, że Twoja aplikacja łączy się przy użyciu utf8mb4:

SET NAMES utf8mb4;

Najlepsze praktyki

  • Zawsze używaj utf8mb4 dla nowych baz danych.

  • ✅ Używaj utf8mb4_unicode_ci dla dokładności lub utf8mb4_general_ci dla wydajności.

  • ✅ Ustaw domyślny zestaw znaków na poziomie tabeli i bazy danych.

  • ✅ Upewnij się, że biblioteki warstwy aplikacji (np. PDO, MySQLi, Sequelize) obsługują utf8mb4.

Podsumowanie

Różnica między utf8 a utf8mb4 w MySQL to więcej niż tylko bajt—jest to różnica między nowoczesną zgodnością Unicode a cichą awarią. Chociaż utf8 pozostaje kompatybilny wstecz, jest przestarzały w wielu nowoczesnych zastosowaniach. Zawsze preferuj utf8mb4, aby zabezpieczyć swoją aplikację na przyszłość i zapewnić pełne wsparcie dla wielojęzyczności, emoji i specjalnych symboli.