mysql, php - проблема кодировки символов - PullRequest
0 голосов
/ 15 апреля 2011

Я делаю проект с Zend Framework и извлекаю данные из базы данных utf-8. Проект также utf-8.

В форме у меня есть элемент select, отображающий список стран. Проблема в: На французском или испанском языках некоторые страны не отображаются.

После выполнения var_dump () из моего списка стран я увидел, что это страны со специальными символами. Акцентированные.

в var_dump я мог видеть символ, представленный как? в бриллианте. Я попытался изменить кодировку на iso-8859-1, и я смог увидеть результат var_dump со специальными символами.

Как данные, поступающие из базы данных utf-8, отображаются в iso-8859-1!

Могу ли я без проблем сохранить набор символов iso-8859-1 в таблице utf-8 в mysql? Разве не должны отображаться испорченные символы?

спутать.

-

delimiter $$

CREATE TABLE `geo_Country` (
  `CountryID` int(10) NOT NULL,
  `CountryName` varchar(45) NOT NULL,
  `CountryCompleteName` varchar(45) NOT NULL,
  `Nationality` varchar(45) NOT NULL,
  `CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `Status` tinyint(1) NOT NULL DEFAULT '1',
  `LanguageCode` char(2) NOT NULL,
  `ZoneID` int(10) NOT NULL,
  PRIMARY KEY (`CountryID`,`LanguageCode`),
  KEY `fk_geo_Country_web_Language1` (`LanguageCode`),
  KEY `fk_geo_Country_geo_Zone` (`ZoneID`),
  KEY `idx_CountryName` (`CountryName`)
  CONSTRAINT `fk_geo_Country_geo_Zone` FOREIGN KEY (`ZoneID`) REFERENCES `geo_Zone` (`ZoneID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_geo_Country_web_Language1` FOREIGN KEY (`LanguageCode`) REFERENCES `web_Language` (`LanguageCode`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

В UTF-8 нужно помнить следующее:

Все в вашем приложении должно быть UTF-8!

Для обычного веб-приложения PHP / MySQL (форма, отправка в базу данных) вам необходимо проверить:

  1. Ваше соединение с базой данных использует UTF-8 (выполните этот запрос сразу после того, как ваше соединение установлено: SET NAMES UTF8;)
  2. Ваш код PHP использует UTF-8. Это означает, что не нужно использовать функции перевода / кодирования набора символов (нет необходимости, когда все в UTF-8).
  3. Ваш вывод HTML - UTF-8, либо отправка заголовка Content-Type: text/html; charset=utf8 с использованием тега <meta charset="utf8"> (для HTML5, для других вариантов HTML используйте <meta http-equiv="Content-Type" content="text/html; charset=utf8">)

В вашем случае var_dump ', в браузер отправляется простой текст без каких-либо упоминаний о наборе символов. Глядя на правило № 3, это означает, что ваш браузер отображает это в другом наборе символов, предположительно латинском1, что дает вам алмазы / вопросительные знаки / блоки.

Если вам нужно проверить, правильно ли хранятся ваши данные, используйте клиент базы данных, такой как PHPMyAdmin, для просмотра записи. Таким образом, вы просматриваете контент как UTF-8 (ПРИМЕЧАНИЕ: это настройка в PMA, поэтому проверьте, не настроен ли он на другую кодировку!).

В примечании для стороны установите для сортировки текстовых столбцов вашей базы данных значение utf8_general_ci, это используется не для хранения, а для сортировки. Так что это не связано с вашей проблемой, но это хорошая практика.

1 голос
/ 15 апреля 2011

При подключении к базе данных необходимо настроить кодирование клинта.
для Zend_Db это должно выглядеть так (обратите внимание на 'driver_options'):

$params = array(
    'host' => 'localhost',
    'username' => 'username',
    'password' => 'password',
    'dbname' => 'dbname',
    'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;');
);

для приложения .ini

resources.db.params.charset = utf8

в качестве последнего средства вы можете просто запустить этот запрос SET NAMES UTF8 вручную, как и любой другой запрос.

...