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

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

 "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 5.3.6 параметр charset игнорировался. Если вы используете более старую версию PHP, вы должны сделать это следующим образом:

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

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

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

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

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

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

Я думаю, вам нужен дополнительный запрос, потому что опция 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'); 

}

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

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

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

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

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