Jaka jest różnica między utf8 a utf8mb4 w MySQL?
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
utf8Dziedziczne 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
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
| Cechy | utf8 | utf8mb4 |
|---|---|---|
| Maks. bajty na znak | 3 | 4 |
| Pokrycie Unicode | Do 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ównania | Ograniczone | Bardziej 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 1Co 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.


