Używanie USTAW ZESTAW ZNAKÓW utf8
po użyciu SET NAMES utf8
faktycznie zresetuje character_set_connection
i collation_connection
do@@character_set_database
i @@collation_database
odpowiednio.
podręcznik stwierdza, że
-
USTAW NAZWY x
jest odpowiednikiemSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
i
USTAW ZESTAW ZNAKÓW x
jest odpowiednikiemSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
podczas gdy SET collation_connection =x
wykonuje również wewnętrznie SET character_set_connection =<
SET character_set_connection =x
wewnętrznie wykonuje również SET collation_connection =<
Więc zasadniczo resetujesz character_set_connection
do @@character_set_database
i collation_connection
do @@collation_database
. Instrukcja wyjaśnia użycie tych zmiennych:
Podsumowując, procedura kodowania/transkodowania, której MySQL używa do przetwarzania zapytania i jego wyników, jest wieloetapowa:
- MySQL traktuje przychodzące zapytanie jako zakodowane w
character_set_client
. - MySQL transkoduje instrukcję z
character_set_client
wcharacter_set_connection
- podczas porównywania wartości ciągów z wartościami kolumn, MySQL transkoduje wartość ciągu z
character_set_connection
do zestawu znaków danej kolumny bazy danych i używa sortowania kolumn do sortowania i porównywania. - MySQL tworzy zestaw wyników zakodowany w
character_set_results
(dotyczy to zarówno danych wynikowych, jak i metadanych wynikowych, takich jak nazwy kolumn itp.)
Może się więc zdarzyć, że SET CHARACTER SET utf8
nie wystarczyłoby do zapewnienia pełnej obsługi UTF-8. Pomyśl o domyślnym zestawie znaków bazy danych latin1
i kolumny zdefiniowane za pomocą utf8
-charset i przejdź przez kroki opisane powyżej. Jako latin1
nie można zakryć wszystkich znaków, które może zakryć UTF-8, możesz utracić informacje o znakach w kroku 3 .
- Krok 3 : Biorąc pod uwagę, że Twoje zapytanie jest zakodowane w UTF-8 i zawiera znaki, których nie można przedstawić za pomocą
latin1
, te znaki zostaną utracone podczas transkodowania zutf8
dolatin1
(domyślny zestaw znaków bazy danych) powodujący niepowodzenie zapytania.
Myślę więc, że można bezpiecznie powiedzieć, że SET NAMES...
jest właściwym sposobem rozwiązywania problemów z zestawem znaków. Nawet jeśli mógłbym dodać, że poprawna konfiguracja zmiennych serwera MySQL (wszystkie wymagane zmienne można ustawić statycznie w pliku my.cnf
) uwalnia Cię od obciążenia wydajnością dodatkowego zapytania wymaganego przy każdym połączeniu.