Лучшие практики PHP и MySQL с международными строками

StackOverflow https://stackoverflow.com/questions/140728

  •  02-07-2019
  •  | 
  •  

Вопрос

Часто случается, что такие персонажи, как é преобразуется в é, хотя параметры сортировки для базы данных MySQL, таблицы и поля установлены на utf8_general_ci.Кодировка в. Тип содержимого для страницы также установлено значение UTF8.

Я знаю про utf8_encode/decode, но не совсем уверен, где и как его использовать.

Я прочитал "Абсолютный минимум, который каждый разработчик программного обеспечения обязательно должен знать о Юникоде и наборах символов (без оправданий!)", но мне нужны некоторые указатели, специфичные для MySQL/PHP.

Вопрос:Как гарантировать, что введенные пользователем данные, содержащие международные символы, не будут повреждены?

Это было полезно?

Решение

При первом взгляде на http://www.nicknetttleton.com/zine/php/php-utf-8-cheatsheet Мне кажется, что не хватает одной важной вещи (возможно, я это упустил из виду).В зависимости от вашей установки и/или конфигурации MySQL вам необходимо установить кодировку соединения, чтобы MySQL знал, какую кодировку вы ожидаете на стороне клиента (имеется в виду клиентская сторона соединения MySQL, которая должна быть вашим PHP-скриптом).Вы можете сделать это, вручную выдав

SET NAMES utf8

запрос перед любым другим запросом, который вы отправляете на сервер MySQL.

Если вы используете PDO на стороне PHP, вы можете настроить соединение для автоматического выполнения этого запроса при каждом (повторном) подключении, используя

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

при инициализации соединения с БД.

Другие советы

Параметры сортировки и кодировки — это не одно и то же.Ваши параметры сортировки должны соответствовать кодировке, поэтому, если ваша кодировка — utf-8, то и параметры сортировки должны соответствовать.Однако выбор неправильного сопоставления не испортит ваши данные — просто заставьте сравнение строк/сортировку работать неправильно.

Тем не менее, есть несколько мест, где вы можете установить настройки кодировки в PHP.Я бы рекомендовал вам использовать utf-8, если это возможно.Места, для которых требуется указание кодировки:

  • База данных.Это можно установить на уровне базы данных, таблицы и поля и даже на уровне каждого запроса.
  • Соединение между PHP и базой данных.
  • HTTP-вывод;Убедитесь, что HTTP-заголовок Content-Type указывает utf-8.Вы можете установить значения по умолчанию в PHP и Apache или использовать PHP. header функция.
  • HTTP-вход.Обычно формы отправляются в той же кодировке, в которой была открыта страница, но чтобы быть уверенным, вам следует указать accept-charset свойство.Также убедитесь, что URL-адреса имеют кодировку utf-8, или избегайте использования символов, отличных от ascii, в URL-адресах (и параметрах GET).

utf8_encodeФункции /decode имеют немного странные названия.Они специально конвертируют между latin1 (ISO-8859-1) и utf-8.Если в вашем приложении все в формате utf-8, вам не придется их часто использовать.

Есть как минимум две ошибки в отношении utf-8 и PHP.Во-первых, встроенные строковые функции PHP ожидают, что строки будут однобайтовыми.Для многих операций это не имеет значения, но означает, что на них нельзя положиться. strlen и другие функции.Существует хороший обзор ограничений на эта страница.Обычно это не является большой проблемой, но особенно при использовании сторонних библиотек вы должны знать, что из-за этого все может пойти прахом.Одним из вариантов является также использование расширения mb_string, которое позволяет заменить все проблемные функции альтернативами, поддерживающими utf-8.Это все еще не стопроцентно надежное решение, но в большинстве случаев оно сработает.

Другая проблема заключается в том, что некоторые установки PHP все еще имеют magic_quotes настройка включена.Эта проблема аналогична utf-8, но может привести к некоторым затруднениям.Выключите его ради собственного здравомыслия.

Не так уж и много того, что не описано в этой статье.

http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

Что вам следует сделать:

  • Убедитесь, что Apache выдает контент в формате UTF-8.Сделайте это в своем httpd.conf или используйте PHP header()-функция сделать это вручную.
  • Убедитесь, что ваше соединение с базой данных — UTF8. SET NAMES utf8 делает свое дело.
  • Убедитесь, что все ваши таблицы настроены на UTF8.
  • Убедитесь, что все ваши файлы PHP и шаблонов закодированы как UTF8, если вы храните в них международные символы.

Обычно вам не нужно много делать, используя mb_string или utf8_encode/decode-функции, когда вы это делаете.

Для большей корректности юникода вам следует использовать utf8_unicode_ci (хотя в документации различия немного расплывчаты).Вы также должны убедиться, что следующие флаги Mysql установлены правильно:

  • набор символов по умолчанию = utf8
  • Skip-character-set-client-handshake //Важно, чтобы клиент не применял другую кодировку

Их можно установить в файле конфигурации mysql (на вкладке [mysqld]) или во время выполнения, отправив соответствующие запросы.

Независимо от языка, на котором оно написано, если вы хотите создать приложение, поддерживающее широкий набор кодировок, обрабатывайте его по частям:

  • Определить кодировку
    • как-то хочется узнать, с какой кодировкой вы имеете дело, иначе рассматривать это дальше довольно бессмысленно.В итоге вы получите мусорные символы.
  • Управляйте своими байтами
    • думайте об этих строках не как о «строках» символов, а скорее как о списках байтов.
    • PHP особенно коварен.Не позволяйте ему усекать ваши данные на лету.Если вы выполняете регулярное выражение строки UTF-8, убедитесь, что вы идентифицируете ее как таковую.
  • Магазин для ЖК
    • Опять же, вы не хотите обрезать данные.Если вы сохраняете предложение на английском языке, можете ли вы также сохранить набор глифов китайского языка?Как насчет арабского?Что из этого потребует больше всего места?Примите это во внимание.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top