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

Ответы на это не единообразны во всей доступной литературе. Так я узнал это.

Слабая сущность требует отношения с другим объектом, чтобы иметь личность. Возьмем заказы и позиции в заказе. Используя только натуральные ключи, идентификатор позиции - номер заказа и номер строки, например, строка порядка 54321. У вас не может быть позиция, которая не является частью заказа, потому что у нее нет идентификатора.

Конечно, вы всегда можете использовать функцию автонабора в СУБД, чтобы назначать кажущуюся идентичность каждой строке, когда она вставлена. Но это не доказывает, что сущность имеет идентичность в реальном мире.

Подкласс не является отдельным объектом, а подмножеством экземпляров в каком-либо другом объекте. Рассмотрим домашних животных, собак и кошек. Могут быть атрибуты, относящиеся к собакам, но не кошки, и наоборот. (есть много подклассов домашних животных, кроме собак и кошек, но я просто держу их просто).

19
задан Mihai Limbășan 11 October 2008 в 16:27
поделиться

6 ответов

На первом взгляде http://www.nicknettleton.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");

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

14
ответ дан 30 November 2019 в 04:25
поделиться

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

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

  • база данных. Это может быть установлено на базе данных, таблице и полевом уровне, и даже на уровне на запрос.
  • Соединение между PHP и базой данных.
  • HTTP производится; Удостоверьтесь, что HTTP-заголовок Content-Type указывает utf-8. Можно установить значения по умолчанию в PHP и в Apache, или можно использовать PHP's header функция.
  • HTTP вводится. Обычно формы будут отправлены в том же наборе символов, как страница была подана в, но удостоверяться, необходимо указать accept-charset свойство. Также удостоверьтесь, что URL является utf-8, закодированным, или избегает использования символов неASCII в URL (И ПОЛУЧИТЕ параметры).

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

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

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

8
ответ дан 30 November 2019 в 04:25
поделиться

Не очень, чтобы быть сказанным, который не охвачен этой статьей

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

2
ответ дан 30 November 2019 в 04:25
поделиться

Вещи необходимо сделать:

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

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

2
ответ дан 30 November 2019 в 04:25
поделиться

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

  • default-character-set=utf8
  • skip-character-set-client-handshake//Важный, таким образом, клиент не осуществляет другое кодирование

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

0
ответ дан 30 November 2019 в 04:25
поделиться

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

  • Определяют кодирование
    • так или иначе, Вы хотите узнать, какое кодирование Вы имеете дело с, иначе, довольно бессмысленно рассмотреть это далее. Вы закончите с символами спама.
  • Дескриптор Ваши байты
    • думают об этих строках меньше как 'строки' символов, и больше как списки байтов
    • , PHP является особенно подлым. Не позволяйте ему усечь Ваши данные на лету. Если Вы - regexing строка UTF-8, удостоверьтесь, что Вы определяете его как таковой
  • Хранилище для жидкокристаллического дисплея
    • Снова, Вы не хотите усекать данные. При хранении предложения на английском языке можно ли также сохранить ряд Мандарина glyphps? Как насчет арабского языка? Какой из них собирается потребовать большей части пространства? Объясните его.
0
ответ дан 30 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: