Я пытаюсь вставить значение кириллицы в таблицу 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');