Раньше у меня это было в моем обычном 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. Порядок предпочтения будет:
charset
в строке DSN SET NAMES utf8
с PDO::MYSQL_ATTR_INIT_COMMAND
подключения 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); }
Выполнение всех трех, вероятно, слишком велико (если вы не пишете класс, который вы планируете распространять или повторно использовать).
Я думаю, вам нужен дополнительный запрос, потому что опция 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");