Тук смесвате API,
mysql_*иmysqli_*не се смесва. Трябва да се придържате къмmysqli_(както изглежда така или иначе сте), катоmysql_*функциите са отхвърлени и премахнати изцяло в PHP7.
Вашият действителен проблем е проблем с набор от знаци някъде. Ето няколко насоки, които могат да ви помогнат да получите правилния набор от знаци за вашето приложение. Това обхваща повечето от общите проблеми, с които може да се сблъска при разработването на PHP/MySQL приложение.
- ВСИЧКИ атрибутите във вашето приложение трябва да бъдат зададени на UTF-8
- Запазете документа като UTF-8 без спецификация (Ако използвате Notepad++, това е
Format->Convert to UTF-8 w/o BOM) -
Заглавката както в PHP, така и в HTML трябва да бъде настроена на UTF-8
-
HTML (вътре в
<head></head>тагове):<meta charset="UTF-8"> -
PHP (в горната част на вашия файл, преди всеки изход):
header('Content-Type: text/html; charset=utf-8');
-
-
След като се свържете с базата данни, задайте набора от знаци на UTF-8 за вашия обект на връзка, като този (директно след свързване)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */Това е за
mysqli_*, има подобни заmysql_*и PDO (вижте долната част на този отговор). -
Също така се уверете, че вашата база данни и таблици са настроени на UTF-8, можете да направите това по следния начин:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;(Всички вече съхранени данни няма да бъдат преобразувани в правилния набор от знаци, така че ще трябва да направите това с чиста база данни или да актуализирате данните, след като направите това, ако има счупени знаци).
- Ако използвате
json_encode(), може да се наложи да приложитеJSON_UNESCAPED_UNICODEфлаг, в противен случай ще преобразува специалните знаци в техния шестнадесетичен еквивалент.
Запомнете това ВСИЧКО в целия ви тръбопровод от код трябва да бъде настроен на UFT-8, в противен случай може да изпитате счупени знаци във вашето приложение.
В допълнение към този списък може да има функции, които имат специфичен параметър за определяне на набор от знаци. Ръководството ще ви разкаже за това (пример е htmlspecialchars()
).
Има и специални функции за многобайтови знаци, например:strtolower() няма да намали многобайтовите знаци, за това ще трябва да използвате mb_strtolower() , вижте тази демо на живо
.
Забележка 1 :Забележете, че някъде е отбелязано като
utf-8(с тире) и някъде катоutf8(без него). Важно е да знаете кога да използвате кои, тъй като те обикновено не са взаимозаменяеми. Например, HTML и PHP искатutf-8, но MySQL не го прави.Забележка 2 :В MySQL "charset" и "collation" не са едно и също нещо, вижте Разлика между кодиране и съпоставяне? . И двете обаче трябва да бъдат настроени на utf-8; обикновено съпоставянето трябва да бъде или
utf8_general_ciилиutf8_unicode_ci, вижте UTF-8:Общи? Кошче? Unicode? .Забележка 3 :Ако използвате емоджи, MySQL трябва да бъде посочен с
utf8mb4charset вместо стандартнияutf8, както в базата данни, така и във връзката. HTML и PHP ще имат самоUTF-8.
Настройка на UTF-8 с mysql_ и ЗНПа
-
PDO:Това се прави в DSN на вашия обект. Обърнете внимание на
charsetатрибут,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass"); -
mysql_:Това се прави много подобно наmysqli_*, но не приема обекта за връзка като първи аргумент.mysql_set_charset('utf8');