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 dlamysql_*
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 zastosowanieJSON_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 domysqli_*
, ale nie przyjmuje obiektu połączenia jako pierwszego argumentu.mysql_set_charset('utf8');