PHP PDO: кодировка, имена наборов?

У меня было это ранее в моем обычном mysql_ * соединении:

mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");

Нужно ли мне это для PDO? И где он должен быть?

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

Ответ 1

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

"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");

Ответ 2

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

<?php

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

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

?>

Ответ 3

Это, наверное, самый элегантный способ сделать это.
Прямо в вызове конструктора 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"
  )
);

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

Ответ 4

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

  • charset в строке DSN
  • Запустите SET NAMES utf8 с опцией подключения PDO::MYSQL_ATTR_INIT_COMMAND
  • Запустите 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);
}

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

Ответ 5

Я думаю, вам нужен дополнительный запрос, потому что опция charset в DSN фактически игнорируется. см. ссылку, размещенную в комментарии другого ответа.

Посмотрите, как Drupal 7 делает это в http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7:

// Force MySQL to use the UTF-8 character set. Also set the collation, if a
// certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
// for UTF-8.
if (!empty($connection_options['collation'])) {
  $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
}
else {
  $this->exec('SET NAMES utf8');

}

Ответ 6

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

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

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

Ответ 7

$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 );   

Ответ 8

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

Ответ 9

global $con,$MODE;
    $dbhost = "localhost";
    $dbuser = "root";
    $dbpassword = "";
    $database = "db_name";



    $con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")) or die ( 'error' );
    $con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );