我之前在我的正常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));

当前回答

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

这可能是最优雅的方法了。 就在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"
  )
);

对我来说很好。

在PHP 5.3.6之前,charset选项被忽略。如果你运行的是旧版本的PHP,你必须这样做:

<?php

    $dbh = new PDO("mysql:$connstr",  $user, $password);

    $dbh -> exec("set names utf8");

?>

我只是想补充一点,您必须确保您的数据库是使用COLLATE utf8_general_ci或任何您想使用的排序规则创建的,否则您可能最终会使用另一个比预期的排序规则。

在phpmyadmin中,您可以通过单击数据库并选择操作来查看排序。如果您尝试使用与数据库不同的排序规则创建表,那么您的表最终将使用数据库排序规则。

因此,在创建表之前,请确保数据库的排序是正确的。希望这能为某人节省几个小时,哈哈

我测试了这段代码

$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'];
}