Intereting Posts
PHP: подключение: сохранить данные о состоянии чтения сокетов Mod Переписать и передать URL как параметр Apigility – Как использовать модуль ORM Doctrine из командной строки ZF2 Каковы важные различия между использованием fopen ($ url) и curl в PHP? Какой HTML Parser (желательно PHP) поддерживает получение смещения текущего узла во входной строке? Отсутствуют данные по углеродным данным Laravel Уведомления электронной почты WooCommerce: разные адресаты электронной почты для разных городов PHP: Предотвращение захвата сеанса с помощью токена, хранящегося в файле cookie? Как получить информацию о подключении пользователя на моем сайте с помощью JavaScript LinkedIn api? Получить цвет изображения PHP tmpfile () возвращает false Я хочу, чтобы загрузчик файлов AJAX, например, загружал файл Gmail с индикатором выполнения в PHP Извлечение суммы в долларах из строки – регулярное выражение в PHP PHPUnit – классы автозагрузки в тестах Создание пользовательских конечных точек WordPress

MySQL и PHP: UTF-8 с кириллицей

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

  • ВСЕ атрибуты всего приложения должны быть установлены в 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 «кодировка» и «сопоставление» – это не одно и то же, см. Раздел «Разница между кодировкой и сортировкой». , Оба должны быть установлены на 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');