Използвайте mysqli_set_charset
за да промените клиентското кодиране на UTF-8 веднага след като се свържете:
$mysqli->set_charset("utf8");
Клиентското кодиране е това, в което MySql очаква вашия вход (например, когато вмъквате предоставен от потребителя текст в заявка за търсене) и това, в което ви дава резултатите (така че трябва да съвпада с вашето изходно кодиране, за да може echo
за да показва правилно нещата).
Трябва да съвпада с кодирането на вашата уеб страница, за да отчетете двата сценария по-горе и кодирането на изходния файл на PHP (така че твърдо кодираните части на вашите заявки да се интерпретират правилно).
Актуализация:Как да конвертирате данни, вмъкнати с помощта на latin-1, в utf-8
По отношение на данни, които вече са били вмъкнати с грешно кодиране на връзката, има удобно решение за отстраняване на проблема. За всяка колона, която съдържа този вид данни, трябва да направите:
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
Заместителите table_name
, column_name
и existing_column_type
трябва да се заменя с правилните стойности от вашата база данни всеки път.
Това, което прави това е
- Кажете на MySql, че трябва да съхранява данни в тази колона на latin1. Този набор от знаци съдържа само малко подмножество utf8, така че като цяло това преобразуване включва загуба на данни, но в този конкретен сценарий данните вече са интерпретирани като latin1 при въвеждане, така че няма да има странични ефекти. Въпреки това, MySql вътрешно ще преобразува байтовото представяне на вашите данни, за да съответства на това, което първоначално е изпратено от PHP.
- Преобразувайте колоната в двоичен тип (
BLOB
), който няма свързана информация за кодиране. В този момент колоната ще съдържа необработени байтове, които са правилен низ от символи utf8. - Преобразувайте колоната в предишния й тип символ, като кажете на MySql, че необработените байтове трябва да се считат за кодирани utf8.
ПРЕДУПРЕЖДЕНИЕ:Можете да използвате този безразборен подход само ако въпросната колона съдържа само неправилно въведени данни. Всички данни, които са били правилно вмъкнати, ще бъдат съкратени при първото поява на символ, различен от ASCII!
Затова е добра идея да го направите точно сега, преди да влезе в сила корекцията от страна на PHP.