我之前在我的正常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));
当前回答
为了完整起见,在从PDO连接到MySQL时,实际上有三种方法来设置编码,哪种方法可用取决于您的PHP版本。优先顺序为:
DSN字符串中的字符集参数 带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);
}
同时做这三件事可能有点过头了(除非您正在编写一个计划发布或重用的类)。
其他回答
你会把它放在你的连接字符串中,像这样:
"mysql:host=$host;dbname=$db;charset=utf8mb4"
然而,在PHP 5.3.6之前,charset选项是被忽略的。如果你运行的是旧版本的PHP,你必须这样做:
$dbh = new PDO("mysql:host=$host;dbname=$db", $user, $password);
$dbh->exec("set names utf8mb4");
我只是想补充一点,您必须确保您的数据库是使用COLLATE utf8_general_ci或任何您想使用的排序规则创建的,否则您可能最终会使用另一个比预期的排序规则。
在phpmyadmin中,您可以通过单击数据库并选择操作来查看排序。如果您尝试使用与数据库不同的排序规则创建表,那么您的表最终将使用数据库排序规则。
因此,在创建表之前,请确保数据库的排序是正确的。希望这能为某人节省几个小时,哈哈
在PHP 5.3.6之前,charset选项被忽略。如果你运行的是旧版本的PHP,你必须这样做:
<?php
$dbh = new PDO("mysql:$connstr", $user, $password);
$dbh -> exec("set names utf8");
?>
我测试了这段代码
$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'];
}
$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);