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

MySQL i PHP:UTF-8 ze znakami cyrylicy

Mieszasz tutaj interfejsy API, mysql_* i mysqli_* nie miesza. Powinieneś trzymać się mysqli_ (jak się wydaje i tak jesteś), jako mysql_* funkcje są przestarzałe i całkowicie usunięte w PHP7.

Twój rzeczywisty problem to gdzieś problem z zestawem znaków. Oto kilka wskazówek, które pomogą Ci uzyskać właściwy zestaw znaków dla Twojej aplikacji. Obejmuje to większość ogólnych problemów, z którymi można się zmierzyć podczas tworzenia aplikacji PHP/MySQL.

  • WSZYSTKIE atrybuty w całej aplikacji muszą być ustawione na UTF-8
  • Zapisz dokument jako UTF-8 bez BOM (jeśli używasz Notepad++, jest to Format -> Convert to UTF-8 w/o BOM )
  • Nagłówek zarówno w PHP, jak i HTML powinien być ustawiony na UTF-8

    • HTML (wewnątrz <head></head> tagi):

      <meta charset="UTF-8">
      
    • PHP (na górze pliku, przed jakimkolwiek wyjściem):

      header('Content-Type: text/html; charset=utf-8');
      
  • Po połączeniu się z bazą danych ustaw zestaw znaków na UTF-8 dla obiektu połączenia, w ten sposób (bezpośrednio po połączeniu)

    mysqli_set_charset($conn, "utf8"); /* Procedural approach */
    $conn->set_charset("utf8");        /* Object-oriented approach */
    

    To jest dla mysqli_* , są podobne dla mysql_* i PDO (patrz dół tej odpowiedzi).

  • Upewnij się również, że twoja baza danych i tabele są ustawione na UTF-8, możesz to zrobić w ten sposób:

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    (Żadne już zapisane dane nie zostaną przekonwertowane na właściwy zestaw znaków, więc musisz to zrobić z czystą bazą danych lub zaktualizować dane po wykonaniu tej czynności, jeśli są uszkodzone znaki).

  • Jeśli używasz json_encode() , może być konieczne zastosowanie JSON_UNESCAPED_UNICODE flaga, w przeciwnym razie przekonwertuje znaki specjalne na ich odpowiednik szesnastkowy.

Pamiętaj, że WSZYSTKO w całym potoku kodu musi być ustawiony na UFT-8, w przeciwnym razie możesz napotkać uszkodzone znaki w swojej aplikacji.

Oprócz tej listy mogą istnieć funkcje, które mają określony parametr do określenia zestawu znaków. W instrukcji dowiesz się o tym (przykładem jest htmlspecialchars() ).

Istnieją również specjalne funkcje dla znaków wielobajtowych, na przykład:strtolower() nie zmniejszy znaków wielobajtowych, w tym celu będziesz musiał użyć mb_strtolower() , zobacz to demonstracja na żywo .

Uwaga 1 :Zauważ, że jego miejsce oznaczone jako utf-8 (z myślnikiem) i gdzieś jako utf8 (bez tego). Ważne jest, aby wiedzieć, kiedy ich użyć, ponieważ zwykle nie są one wymienne. Na przykład HTML i PHP chcą utf-8 , ale MySQL nie.

Uwaga 2 :W MySQL „zestaw znaków” i „porównanie” to nie to samo, zobacz Różnica między kodowaniem a sortowaniem? . Oba powinny być jednak ustawione na utf-8; generalnie sortowanie powinno być albo utf8_general_ci lub utf8_unicode_ci , zobacz UTF-8:Ogólne? Kosz? Unicode? .

Uwaga 3 :Jeśli używasz emotikonów, MySQL musi być określony za pomocą utf8mb4 zestaw znaków zamiast standardowego utf8 , zarówno w bazie danych, jak iw połączeniu. HTML i PHP będą miały po prostu UTF-8 .

Ustawianie UTF-8 za pomocą mysql_ i ChNP

  • PDO:Odbywa się to w DSN twojego obiektu. Zwróć uwagę na charset atrybut,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Robi się to bardzo podobnie do mysqli_* , ale nie przyjmuje obiektu połączenia jako pierwszego argumentu.

    mysql_set_charset('utf8');
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL — ta wersja MySQL nie obsługuje jeszcze podzapytania 'LIMIT &IN/ALL/ANY/SOME

  2. Jak podzielić dane wyjściowe z mysqldump na mniejsze pliki?

  3. Jak wstawić wartości w tabeli z kluczem obcym za pomocą MySQL?

  4. 1052:Kolumna „id” na liście pól jest niejednoznaczna

  5. Wstaw tablicę do bazy danych MySQL za pomocą PHP