Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy konieczne jest ustawienie SET CHARACTER SET utf8?

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 odpowiednikiem

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • i USTAW ZESTAW ZNAKÓW x jest odpowiednikiem

    SET 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 =<> i 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:

  1. MySQL traktuje przychodzące zapytanie jako zakodowane w character_set_client .
  2. MySQL transkoduje instrukcję z character_set_client w character_set_connection
  3. 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.
  4. 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 z utf8 do latin1 (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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. problem z kluczem obcym w jdbc

  2. Jak znaleźć brakujące wiersze danych za pomocą SQL?

  3. obliczanie i pokazywanie daty jako „sek temu”, „minuty temu”, „godziny temu” itp

  4. MySQL:Uzyskiwanie numeru wiersza (rankingu) dla określonego wiersza

  5. Pobierz dane konkretnego użytkownika w PHP