Я пытаюсь вставить значение кириллицы в таблицу MySQL, но проблема с кодировкой.
Php:
<?php $servername = "localhost"; $username = "a"; $password = "b"; $dbname = "c"; $conn = new mysqli($servername, $username, $password, $dbname); mysql_query("SET NAMES 'utf8';"); mysql_query("SET CHARACTER SET 'utf8';"); mysql_query("SET SESSION collation_connection = 'utf8_general_ci';"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "UPDATE `c`.`mainp` SET `search` = 'test тест' WHERE `mainp`.`id` =1;"; if ($conn->query($sql) === TRUE) { } $conn->close(); ?>
MySQL:
| id | search | | 1 | test ав |
Примечание. PHP-файл – utf-8 , сортировка базы данных utf8_general_ci
Вы смешиваете API здесь,
mysql_*иmysqli_*не смешиваются. Вы должны придерживатьсяmysqli_(как вам кажется, так или иначе), поскольку функцииmysql_*устарели и полностью удалены в PHP7.
Ваша актуальная проблема – проблема с кодировкой. Вот несколько указателей, которые помогут вам получить правильную кодировку для вашего приложения. Это охватывает большинство общих проблем, с которыми можно столкнуться при разработке приложения PHP / MySQL.
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 «кодировка» и «сопоставление» – это не одно и то же, см. Раздел «Разница между кодировкой и сортировкой». , Оба должны быть установлены на utf-8; в общем случае сопоставление должно быть либо
utf8_general_ciлибоutf8_unicode_ci, см. UTF-8: General? Бен? Unicode? ,Примечание 3 : Если вы используете emojis, MySQL должен быть указан с помощью кодировки
utf8mb4вместо стандартногоutf8, как в базе данных, так и в соединении. HTML и PHP будут иметь толькоUTF-8.
Настройка UTF-8 с помощью mysql_ и PDO
PDO: Это делается в DSN вашего объекта. Обратите внимание на атрибут charset ,
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
mysql_ : Это очень похоже на mysqli_* , но в качестве первого аргумента он не принимает объект-соединение.
mysql_set_charset('utf8');
Решение:
mysql_query("SET NAMES 'utf8';"); > $mysqli->set_charset('utf8');