Несоответствие кодировки символов
Мои сценарии определенно сохранены в UTF-8. Я создаю экземпляр PDO с "{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8"
, Мои таблицы используют InnoDB и сопоставляются с использованием utf8_general_ci. Мои страницы отправляются либо с Content-Type: text/html; charset=UTF-8
заголовок или <meta>
эквивалент.
При использовании PDO для хранения символа €, исходящего из HTTP-ввода или строкового литерала в исходном коде, у меня остается c3 a2 e2 80 9a c2 ac
в соответствии с MySQL Workbench 5.2. Извлечение этого из базы данных и отображение его на странице работает нормально. Еще в phpMyAdmin и Workbench я вижу €
,
При использовании этих двух инструментов для хранения € у меня остается e2 82 ac
, что, по-видимому, является правильным представлением UTF-8, но если я попытаюсь извлечь и затем вывести это с помощью PHP, появится.
Мой вопрос: откуда возникает это несоответствие, и возможно ли, чтобы мои веб-страницы и инструменты базы данных работали безупречно?
3 ответа
Директива charset в DSN фактически применяется к MSSQL. Мне просто нужно было выполнить SET NAMES
, Извини за это.
Я добился этого таким образом:
parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
$this->user, $this->password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
Просто конвертируйте € в html-объект & евро; для суперфикса (но вы можете получить проблему с другими специальными символами)
другая сторона проблемы (и более конкретно) - проверка mysql character_set_server и наиболее частая причина character_set_client - seeAlso: наборы соединений
также важно отметить, что метаэквивалент не имеет значения, вы должны всегда устанавливать заголовок ('Content-Type: ...)
Поскольку ваша HTML-страница верна, кажется, что вы храните правильные данные в базе данных.
€
является кодировкой UTF-8 знака евро, неправильно интерпретированной как windows-1252. Похоже, что ваши инструменты Windows используют кодировку "ANSI" вместо кодировки базы данных.