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

UTF-8 przez całą drogę

Przechowywanie danych :

  • Określ utf8mb4 zestaw znaków we wszystkich tabelach i kolumnach tekstowych w Twojej bazie danych. To sprawia, że ​​MySQL fizycznie przechowuje i pobiera wartości zakodowane natywnie w UTF-8. Zwróć uwagę, że MySQL domyślnie użyje utf8mb4 kodowanie, jeśli utf8mb4_* określono sortowanie (bez żadnego wyraźnego zestawu znaków).

  • W starszych wersjach MySQL (<5.5.3) będziesz niestety zmuszony używać po prostu utf8 , który obsługuje tylko podzbiór znaków Unicode. Chciałbym żartować.

Dostęp do danych :

  • W kodzie aplikacji (np. PHP), w dowolnej metodzie dostępu do bazy danych, której używasz, musisz ustawić zestaw znaków połączenia na utf8mb4 . W ten sposób MySQL nie dokonuje konwersji ze swojego natywnego UTF-8, gdy przekazuje dane do aplikacji i na odwrót.

  • Niektóre sterowniki udostępniają własny mechanizm konfiguracji zestawu znaków połączenia, który zarówno aktualizuje swój własny stan wewnętrzny, jak i informuje MySQL o kodowaniu, które ma być używane w połączeniu — jest to zwykle preferowane podejście. W PHP:

    • Jeśli używasz PDO warstwa abstrakcji z PHP ≥ 5.3.6, możesz określić charset w DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Jeśli używasz mysqli , możesz zadzwonić set_charset() :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Jeśli utkniesz ze zwykłym mysql ale używasz PHP w wersji 5.2.3, możesz zadzwonić mysql_set_charset .

  • Jeśli sterownik nie zapewnia własnego mechanizmu ustawiania zestawu znaków połączenia, może być konieczne wysłanie zapytania, aby poinformować MySQL, w jaki sposób aplikacja oczekuje zakodowania danych dotyczących połączenia:USTAW NAZWY 'utf8mb4' .

  • Ta sama uwaga dotycząca utf8mb4 /utf8 obowiązuje jak powyżej.

Wyjście :

  • Jeśli Twoja aplikacja przesyła tekst do innych systemów, będą one również musiały zostać poinformowane o kodowaniu znaków. W przypadku aplikacji internetowych przeglądarka musi być informowana o kodowaniu, w jakim wysyłane są dane (poprzez nagłówki odpowiedzi HTTP lub metadane HTML ).

  • W PHP możesz użyć default_charset php.ini lub ręcznie wydaj Content-Type Sam nagłówek MIME, co jest po prostu więcej pracy, ale daje ten sam efekt.

  • Podczas kodowania danych wyjściowych za pomocą json_encode() , dodaj JSON_UNESCAPED_UNICODE jako drugi parametr.

Wprowadzanie :

  • Niestety, powinieneś zweryfikować każdy otrzymany ciąg jako poprawny UTF-8, zanim spróbujesz go zapisać lub użyć w dowolnym miejscu. PHP mb_check_encoding() załatwia sprawę, ale musisz jej używać religijnie. Naprawdę nie ma sposobu na obejście tego, ponieważ złośliwi klienci mogą przesyłać dane w dowolnym kodowaniu, a ja nie znalazłem sztuczki, która pozwoliłaby PHP zrobić to niezawodnie.

  • Z mojej lektury aktualnej specyfikacji HTML , poniższe podpunkty nie są już potrzebne ani nawet ważne dla współczesnego kodu HTML. Rozumiem, że przeglądarki będą pracować i przesyłać dane w zestawie znaków określonym dla dokumentu. Jeśli jednak kierujesz reklamy na starsze wersje HTML (XHTML, HTML4 itp.), poniższe wskazówki mogą być przydatne:

    • Tylko dla HTML przed HTML5 :chcesz, aby wszystkie dane przesyłane do Ciebie przez przeglądarki były w UTF-8. Niestety, jeśli pójdziesz jedyną drogą, aby to zrobić niezawodnie, jest dodanie accept-charset atrybut do wszystkich Twoich
      tagi: .
    • Tylko dla HTML przed HTML5 :zauważ, że specyfikacja HTML W3C mówi, że klienci "powinni" domyślnie wysyłać formularze z powrotem do serwera w dowolnym zestawie znaków, który serwer obsługiwał, ale jest to najwyraźniej tylko zalecenie, stąd potrzeba wyraźnego określenia każdego pojedynczego tag.

Inne kwestie związane z kodem :

  • Oczywiście wszystkie pliki, które będziesz udostępniać (PHP, HTML, JavaScript itp.) powinny być zakodowane w poprawnym UTF-8.

  • Musisz się upewnić, że za każdym razem, gdy przetwarzasz ciąg znaków UTF-8, robisz to bezpiecznie. To jest niestety najtrudniejsza część. Prawdopodobnie będziesz chciał szeroko wykorzystać mbstring rozszerzenie.

  • Wbudowane operacje na ciągach PHP nie domyślnie sejf UTF-8. Jest kilka rzeczy, które możesz bezpiecznie zrobić za pomocą normalnych operacji na ciągach PHP (takich jak konkatenacja), ale dla większości rzeczy powinieneś użyć równoważnego mbstring funkcja.

  • Aby wiedzieć, co robisz (czytaj:nie zepsuj tego), naprawdę musisz znać UTF-8 i jak działa na najniższym możliwym poziomie. Sprawdź dowolne linki z utf8.com aby uzyskać dobre zasoby, aby dowiedzieć się wszystkiego, co musisz wiedzieć.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQLDumper:narzędzie do tworzenia kopii zapasowych baz danych MySQL oparte na PHP i Perlu

  2. Jak uzyskać dzisiejsze rekordy w MySQL

  3. Przywróć tradycyjną replikację z GTID

  4. Jak najlepiej uzyskać czyjąś „ranking” z tabeli wyników za pomocą php i mysql bez zapętlania

  5. Błąd 1064 w CREATE TABLE... TYPE=MYISAM