Тук смесвате 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 трябва да бъде посочен с
utf8mb4
charset вместо стандартния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');