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之前,字符集选项被忽略了。 如果你正在运行一个较老版本的PHP,你必须这样做:
$dbh = new PDO("mysql:$connstr", $user, $password); $dbh->exec("set names utf8");
在PHP 5.3.6之前,字符集选项被忽略。 如果你正在运行一个较老版本的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" ) );
对我很好。
为了完整起见,从PDO连接到MySQL时,实际上有三种方法来设置编码,哪些可用取决于您的PHP版本。 优先顺序是:
- DSN字符串中的
charset
参数 - 使用
PDO::MYSQL_ATTR_INIT_COMMAND
连接选项运行SET NAMES utf8
- 手动运行
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); }
做这三个可能是矫枉过正的(除非你正在编写一个你打算分发或重用的类)。
我想你需要额外的查询,因为实际上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中,您可以通过单击数据库并选择操作来查看排序规则。 如果您尝试使用另一个排序规则创建表而不是数据库,则您的表最终将以数据库排序规则结束。
因此,在创建表之前,请确保数据库的排序规则是正确的。 希望这可以节省几个小时的人
$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”);
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 );