Что альтернатива для mysql_set_charset ($ connection, & ldquo; utf8 & rdquo;); в pdo [дубликат]

Я сделал ошибку Google о том, что нет надежного способа выбрать страницу в BottomNavigationView: https://code.google.com/p/android/issues/detail?id=233697

У NavigationView, похоже, была аналогичная проблема, которую они исправили добавлением нового метода setCheckedItem ().

166
задан Álvaro González 28 April 2013 в 17:16
поделиться

10 ответов

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

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

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

$dbh = new PDO("mysql:$connstr",  $user, $password);
$dbh->exec("set names utf8");
389
ответ дан Cobra_Fast 22 August 2018 в 10:24
поделиться
  • 1
    Стоит отметить, что это поведение изменилось в 5.3.6 и теперь работает правильно. – igorw 10 November 2011 в 12:47
  • 2
    должен быть utf 8 вместо UTF-8 "mysql: host = $ host; dbname = $ db; charset = utf8 & quot; – od3n 17 February 2012 в 05:33
  • 3
    Игнорируйте ответы ниже, если вы используете обновленную версию PHP: она отлично работает в php 5.3.8. – kasimir 2 May 2012 в 16:02
  • 4
    Должен ли я также указывать сопоставление в этом случае? Например, «SET NAMES utf8 COLLATE utf8_unicode_ci»? – datasn.io 12 September 2014 в 12:15
  • 5
    Благодаря! Спас мой день! – Aleksandr 19 January 2017 в 20:36

Для полноты есть три способа установить кодировку при подключении к MySQL из PDO и какие из них зависят от вашей версии PHP. Порядок предпочтения будет:

  1. charset параметр в строке DSN
  2. Запустить SET NAMES utf8 с опцией PDO::MYSQL_ATTR_INIT_COMMAND подключения
  3. Запустить SET NAMES utf8 вручную

В этом примере кода реализованы все три:

<?php

define('DB_HOST', 'localhost');
define('DB_SCHEMA', 'test');
define('DB_USER', 'test');
define('DB_PASSWORD', 'test');
define('DB_ENCODING', 'utf8');


$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_SCHEMA;
$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);

if( version_compare(PHP_VERSION, '5.3.6', '<') ){
    if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
        $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . DB_ENCODING;
    }
}else{
    $dsn .= ';charset=' . DB_ENCODING;
}

$conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options);

if( version_compare(PHP_VERSION, '5.3.6', '<') && !defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
    $sql = 'SET NAMES ' . DB_ENCODING;
    $conn->exec($sql);
}

Выполнение всех трех, вероятно, слишком велико (если вы не пишете класс, планируете распространять или повторно использовать).

16
ответ дан Álvaro González 22 August 2018 в 10:24
поделиться
  • 1
    Существует ли эквивалент ODBC / Access? У меня теперь есть работающее соединение Oracle и MySQL PHP PDO UTF8, но я не могу заставить его работать для ODBC / Access. – Jan 28 May 2015 в 13:32
  • 2
    Ох и никогда НЕ ОПРЕДЕЛИТЕ пароль вашей базы данных. Они такие же глобальные, как суперглобалы, и это нехорошо, когда вы работаете с паролями. – Xesau 24 August 2015 в 19:56

$ con = new PDO ("mysql: host = $ dbhost; dbname = $ database; charset = $ encoding", "$ dbuser", "$ dbpassword");

-1
ответ дан Dilmurod 22 August 2018 в 10:24
поделиться

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

<?php

    $dbh = new PDO("mysql:$connstr",  $user, $password);

    $dbh -> exec("set names utf8");

?>
59
ответ дан Don MacAskill 22 August 2018 в 10:24
поделиться
  • 1
    Замечание к модам: Это правильный ответ, и он был опубликован за год до того, как принятый ответ изменил эту информацию. – dotancohen 24 December 2013 в 08:38
$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
0
ответ дан gaurav daxini 22 August 2018 в 10:24
поделиться
  • 1
    Хотя этот ответ, вероятно, правильный и полезный, рекомендуется включить в него некоторое объяснение, чтобы объяснить, как оно помогает решить проблему. Это становится особенно полезным в будущем, если есть изменения (возможно, не связанные), которые заставляют его перестать работать, и пользователи должны понимать, как он работал. – Erty Seidohl 23 May 2018 в 22:03

Я тестирую этот код и

$db=new PDO('mysql:host=localhost;dbname=cwDB','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$sql="select * from products  ";
$stmt=$db->prepare($sql);
$stmt->execute();
while($result=$stmt->fetch(PDO::FETCH_ASSOC)){                  
    $id=$result['id'];
}
0
ответ дан GYaN 22 August 2018 в 10:24
поделиться
  • 1
    Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – rollstuhlfahrer 6 April 2018 в 07:07
  • 2
    Вы проверяете этот код и что ? – Pang 7 August 2018 в 09:05

Это, наверное, самый элегантный способ сделать это. Прямо в вызове конструктора PDO, но избегая опции багги-кодировки (как упоминалось выше):

$connect = new PDO(
  "mysql:host=$host;dbname=$db", 
  $user, 
  $pass, 
  array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
  )
);

Отлично работает для меня.

35
ответ дан Jpsy 22 August 2018 в 10:24
поделиться
  • 1
    Я понимаю, что это также неверно для php 5.3.0. В этом случае вам нужно ввести параметр в массив, указав его номер, а не его имя: array(1002 => 'SET NAMES utf8',...). – JDelage 25 February 2012 в 01:50
  • 2
    Спасибо за подсказку! Я успешно использую вышеуказанный код на нескольких производственных системах, работающих с различными версиями PHP 5.3.X, но на самом деле ни один из них не является 5.3.0. – Jpsy 26 February 2012 в 18:08
  • 3
    Я считаю, что он может быть более элегантным без конкретных параметров базы данных – Aalex Gabi 6 September 2012 в 17:51
  • 4
    Правда, MYSQL_ATTR_INIT_COMMAND доступен только для баз данных MySQL (для доступных команд для каждого типа db см. Подстраницы php.net/manual/de/pdo.drivers.php ). Но это именно то, о чем попросил ОП. – Jpsy 6 November 2012 в 13:54
  • 5
    передача charset=utf8 в строке dsn работает! Я пытался выяснить этот вопрос на странице groups.google.com/d/msg/auraphp/syMS26Rz-q8/9laQr9tR4EoJ – Hari K T 14 November 2013 в 07:17

Я просто хочу добавить, что вы должны убедиться, что ваша база данных создана с помощью COLLATE utf8_general_ci или любой другой сортировки, которую вы хотите использовать. Кроме того, вы можете получить другую, чем предполагалось.

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

Поэтому убедитесь, что сортировка для вашей базы данных прямо перед созданием таблиц. Надеюсь, это сэкономит кому-то несколько часов lol

2
ответ дан Medda86 22 August 2018 в 10:24
поделиться
  • 1
    «Если вы попытаетесь создать таблицы с другим сопоставлением, чем ваша база данных, ваши таблицы в конечном итоге будут иметь сортировку базы данных» - Я не думаю, что это правильно. Сравнение таблиц имеет приоритет перед сопоставлением базы данных. dev.mysql.com/doc/refman/5.5/en/charset-table.html – humble_wolf 7 October 2017 в 09:32
$con="";
$MODE="";
$dbhost = "localhost";
$dbuser = "root";
$dbpassword = "";
$database = "name";

$con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   
2
ответ дан Pang 22 August 2018 в 10:24
поделиться
2
ответ дан Pang 5 November 2018 в 07:37
поделиться
Другие вопросы по тегам:

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