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