Użyj charsetu utf8mb4 i collacji utf8mb4_unicode_ci w MySQL i zmień je za pomocą phpMyAdmin lub poleceń ALTER, pamiętaj także o SET NAMES dla połączenia.
Charset (zestaw znaków) określa, które znaki baza danych może zapisywać, a collation określa, jak znaki są porównywane i sortowane. Nieprawidłowy charset jest najczęstszą przyczyną tego, że duńskie litery (æ, ø, å) lub emoji wyświetlają się jako znak zapytania lub mojibake (np. æ zamiast æ).
Używaj utf8mb4 jako zestawu znaków oraz utf8mb4_unicode_ci jako collacji. utf8mb4 obsługuje wszystkie znaki Unicode, w tym emoji.
Zmień domyślne ustawienie dla całej bazy danych (dotyczy tylko nowych tabel):
utf8mb4_unicode_ci w menu rozwijanym.Zmień istniejącą tabelę (wraz ze wszystkimi jej kolumnami):
Zmień domyślne ustawienie bazy danych:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Zmień tabelę i wszystkie jej kolumny:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
W phpMyAdmin możesz zmienić charset dla poszczególnej kolumny: wybierz tabelę, kliknij Struktura, kliknij Zmień przy kolumnie i wybierz nową collation w definicji kolumny.
Wygeneruj polecenia ALTER automatycznie:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
Uruchom wynik w phpMyAdmin na zakładce SQL lub w wierszu poleceń.
Charset bazy danych i charset połączenia to dwie różne rzeczy. Nawet jeśli twoje tabele są poprawnie ustawione na utf8mb4, znaki mogą ulec uszkodzeniu w tranzycie, jeśli połączenie między aplikacją a MySQL używa innego charsetu.
SET NAMES utf8mb4 ustawia trzy zmienne sesji jednocześnie:
character_set_client — co serwer oczekuje otrzymać od klientacharacter_set_connection — co serwer używa wewnętrznie podczas przetwarzania zapytańcharacter_set_results — co serwer odsyła z powrotem do klientaSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Lepsza praktyka: używaj wbudowanej opcji charset sterownika zamiast ręcznego wysyłania SET NAMES. Zapewnia to, że również funkcje takie jak mysqli_real_escape_string() i PDO::quote() wykorzystują właściwy charset — w przeciwnym razie w rzadkich przypadkach możesz otworzyć drzwi do SQL‑injection.
Artykuły z kategorii pomocy technicznej: MySQL