Simply.com is available in english

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):

  1. Zaloguj się do phpMyAdmin i wybierz bazę danych po lewej stronie.
  2. Kliknij zakładkę Operacje.
  3. Znajdź sekcję Sortowanie (Collation).
  4. Wybierz utf8mb4_unicode_ci w menu rozwijanym.
  5. Kliknij Wykonaj.

Zmień istniejącą tabelę (wraz ze wszystkimi jej kolumnami):

  1. Wybierz tabelę po lewej stronie.
  2. Kliknij zakładkę Operacje.
  3. W sekcji Opcje tabeli wybierz nową collation.
  4. Zaznacz Zmień również sortowanie dla wszystkich kolumn.
  5. 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 klienta
  • character_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

Inne istotne artykuły