是PDO ... SET NAMES utf8危险吗?

时间:2017-01-21 17:17:57

标签: php mysql pdo utf-8 database-security

在此处查看:http://www.php.net/manual/en/mysqlinfo.concepts.charset.php

我明白使用

  

SET NAMES utf8

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

  1. 问题是什么?
  2. 如何避免?
  3. 这实际上是为PHP 3.6或更高版本中的(或所有)PDO连接设置字符集的解决方案吗?
  4. 我担心的代码很危险:

    $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'
                ));
    

    谢谢!

1 个答案:

答案 0 :(得分:2)

你真的还在使用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之前是替代方案。

我觉得“危险”太强了,甚至在5.3.6之前。

相关技巧:在init_command = SET NAMES ... 中使用my.cnf是错误的,因为在init_command连接时未执行root

utf8mb4是UTF-8的首选CHARACTER SET,因为它包含表情符号以及utf8中缺少的一些中文字符。从MySQL 5.5.3开始提供该charset。