Nano Hash - криптовалюты, майнинг, программирование

Кодировка PDO MySQL dsn не работает

Я пытаюсь использовать следующий код для Lubuntu 12.04, Apache, PHP 5.5.3-1ubuntu2, pdo_mysql 5.5.32 и MySQL 5.5.32-0ubuntu7-log.

$dbh = new \PDO("mysql:host=$hostname;dbname=test_db;charset=utf-8", $username, $password);

$dbh->exec('SET NAMES utf8');

$sql = "SELECT name FROM test_table";
foreach ($dbh->query($sql) as $row) {
    error_log(bin2hex($row['name']));
}

И я получаю 44656d6f737472616369c3b36e. Если я прокомментирую запрос SET NAMES utf8, я получу 44656d6f737472616369f36e (разница в том, что c3b3 вместо f3).

От клиента MySQL при выдаче SELECT HEX(name) FROM test_table limit 1; я получаю 44656D6F737472616369C3B36E.

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

Я делаю что-то неправильно?

ИЗМЕНИТЬ

Я пробовал как с charset=utf-8, так и с charset=utf8, и я получаю тот же результат.

Выход SHOW CREATE TABLE test_table:

CREATE TABLE `test_table` (
    `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Соответствующий вывод SHOW FULL COLUMNS FROM test_table:

+-------+--------------+-----------------+
| Field | Type         | Collation       |
+-------+--------------+-----------------+
| name  | varchar(255) | utf8_general_ci |
+-------+--------------+-----------------+
30.10.2013

  • Разве это не должно быть просто charset=utf8? 30.10.2013
  • какая сортировка/кодировка в полях test_table и name? show create table test_table покажет это. 30.10.2013
  • @raina77ow Я попробовал оба варианта, но результат один и тот же. 31.10.2013
  • В my.cnf установлено skip-character-set-client-handshake? Если да, то каково значение character-set-server? 31.10.2013
  • @ Энтони character-set-server = utf8, но skip-character-set-client-handshake не установлено. Я не могу проверить фактическое значение, потому что оно не отображается на show variables. 04.11.2013

Ответы:


1

У вас будет это в строке подключения, например:

"mysql:host=$host;dbname=$db;charset=utf8"

ОДНАКО, до версии PHP 5.3.6 параметр charset игнорировался. Если вы используете более старую версию PHP, вы должны сделать это следующим образом:

$dbh = new PDO("mysql:$connstr",  $user, $password);
$dbh->exec("set names utf8");

Ссылка: PHP PDO: набор символов, набор имен?

Или, если вы хотите, вы можете сделать это:

<?php

$dsn = 'mysql:host=localhost;dbname=testdb';

$username = 'username';
$password = 'password';

$options = array(
  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

$dbh = new PDO($dsn, $username, $password, $options);
30.10.2013
  • Он упомянул версию PHP в вопросе. 30.10.2013
  • Ответы не только для OP. Этот ответ может помочь пользователям со старыми версиями PHP. 30.10.2013
  • да, это помогло мне понять, что у нас 5.3.3 вместо 5.3.6! 05.11.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..