PDO ... SET NAMES utf8 危险吗?

Is PDO ... SET NAMES utf8 dangerous?

看这里:http://www.php.net/manual/en/mysqlinfo.concepts.charset.php

我知道使用

SET NAMES utf8

不是一个好主意,但不清楚:

  1. 问题是什么?
  2. 如何避免?
  3. 在 PHP 3.6 或更高版本中为一个(或所有)PDO 连接设置字符集的实际解决方案是什么?

我担心的代码是危险的:

$this->_conn = new PDO('mysql:host=host.name.blabla;dbname=my_database_name','username', 'password',array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION,
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
            ));

谢谢!

你真的还在使用 PHP >= 版本 3.6 和 < 5.3.6 吗?

假设您有 5.3.6 或更高版本...

Character sets PDO_MYSQL DSN 说你应该使用

$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8",
               'my_user', 'my_pass');

并暗示(不够清楚)如果合适,utf8 应替换为 utf8mb4

PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' 没那么好,但在 5.3.6 之前是替代品。

我认为 "dangerous" 这个词太强了,即使是 5.3.6 之前的版本也是如此。

相关技术:在my.cnf中使用init_command = SET NAMES ... 是不好的因为init_command在连接为root时不执行.

utf8mb4 是 UTF-8 的首选 CHARACTER SET,因为它包含表情符号和 utf8 中缺少的一些汉字。该字符集从 MySQL 版本 5.5.3 开始可用。