我以前在正常的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_ *连接中拥有此功能:
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));
Answers:
您将在连接字符串中添加它,例如:
"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构造函数调用中,但是避免了有问题的charset选项(如上所述):
$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"
)
);
对我来说很棒。
array(1002 => 'SET NAMES utf8',...)
。
charset=utf8
dsn字符串有效!我试图在groups.google.com/d/msg/auraphp/syMS26Rz-q8/9laQr9tR4EoJ
为了完整起见,从PDO连接到MySQL时,实际上有三种方法来设置编码,哪些可用取决于您的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);
}
完全执行这三个步骤可能会显得过大(除非您要编写计划分发或重用的课程)。
我只想补充一点,您必须确保使用COLLATE utf8_general_ci或您要使用的任何排序规则创建数据库,否则您可能会得到另一个未预期的数据库。
在phpmyadmin中,您可以通过单击数据库并选择操作来查看排序规则。如果您尝试使用数据库以外的其他排序规则创建表,则无论如何,表将最终以数据库排序规则结束。
因此,在创建表之前,请确保数据库的排序规则正确。希望这可以节省几个小时的时间
我认为您需要一个额外的查询,因为DSN中的charset选项实际上被忽略了。请参阅其他答案的评论中张贴的链接。
在http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7中查看Drupal 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');
}
$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
$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 );
我测试此代码,
$db=new PDO('mysql:host=localhost;dbname=cwDB','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$sql="select * from products ";
$stmt=$db->prepare($sql);
$stmt->execute();
while($result=$stmt->fetch(PDO::FETCH_ASSOC)){
$id=$result['id'];
}