Zestaw znaków i collation w bazie danych MySQL
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 æ).
Zalecane wartości
Używaj utf8mb4 jako zestawu znaków oraz utf8mb4_unicode_ci jako collacji. utf8mb4 obsługuje wszystkie znaki Unicode, w tym emoji.
Metoda 1: phpMyAdmin
Zmień domyślne ustawienie dla całej bazy danych (dotyczy tylko nowych tabel):
- Zaloguj się do phpMyAdmin i wybierz bazę danych po lewej stronie.
- Kliknij zakładkę Operacje.
- Znajdź sekcję Sortowanie (Collation).
- Wybierz
utf8mb4_unicode_ciw menu rozwijanym. - Kliknij Wykonaj.
Zmień istniejącą tabelę (wraz ze wszystkimi jej kolumnami):
- Wybierz tabelę po lewej stronie.
- Kliknij zakładkę Operacje.
- W sekcji Opcje tabeli wybierz nową collation.
- Zaznacz Zmień również sortowanie dla wszystkich kolumn.
- Kliknij Wykonaj.
Metoda 2: SQL
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.
Konwertuj wszystkie tabele jednocześnie
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 połączenia (SET NAMES)
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 klienta
SET 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