8

根据 php.net、Stack Overflow 和其他信任来源,我可以找到 4 种在 PDO 连接上设置 UTF-8 的不同方法,但找不到更好的选择:

$pdo_db = 'mysql:host=localhost;dbname=local_db;charset=utf8'; // METHOD #1
$pdo_login = 'root';
$pdo_pass = 'localpass';

$db = new PDO($pdo_db, $pdo_login, $pdo_pass, array(
    PDO::ATTR_ERRMODE => $localhost ? PDO::ERRMODE_EXCEPTION : PDO::ERRMODE_SILENT,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', // METHOD #2
));
$db->exec('SET NAMES utf8'); // METHOD #3
$db->exec('SET CHARACTER SET utf8'); // METHOD #4

所以,我的理解是,方法 1 仅适用于 PHP 5.3+(但似乎有点错误),方法 2 仅适用于 MySQL。方法 3 和 4 之间的区别是MySQL 的东西,但我仍然不知道哪个更好。有没有办法在 PDO 属性中调用 SET NAMES,但不是只用于 MySQL?

4

2 回答 2

6

在 DSN 中设置它是唯一正确的方法(尽管它仅从 5.3 开始支持)。
您可以同时使用这个SET NAMES

所有其他方式将使臭名昭著的半虚构 GBK 注入成为可能。

请注意,您对 error_reporting() 的设置是完全错误的。它必须是无条件的-1。如果您担心显示display_errors错误 -可以在运行时设置一个适当的 ini 设置,称为。
虽然 error_reporting 设置错误级别并且应该始终处于最大值。

于 2012-12-26T15:42:20.733 回答
-3

我总是在我的 dbconfig 文件中写下这些代码:

mysql_query("SET character_set_results = 'utf8',
                 character_set_client = 'utf8', 
                 character_set_connection = 'utf8',
                 character_set_database = 'utf8',  
                 character_set_server = 'utf8'");
于 2012-12-26T15:19:58.397 回答