【问题标题】:Is PDO ... SET NAMES utf8 dangerous?PDO ... SET NAMES utf8 危险吗?
【发布时间】:2017-01-21 17:17:56
【问题描述】:

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

我明白使用

设置名称 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 mysql pdo utf-8 database-security


【解决方案1】:

你真的还在使用 PHP >= version 3.6 and

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

Character setsPDO_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 之前。

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

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

【讨论】:

  • 哎呀,我实际上使用的是 PHP 5.6。所以你的解决方案必须有效......但我已经尝试了utf8mb4和utf8......但没有工作。我再打一次。但如果它实际上并不危险,它将保持现在的状态(我之前粘贴的代码)。非常感谢!
  • 仅供参考:在 MySQL 中,utf8mb4 能够包含表情符号和汉字因为它拥有 4 个字节,而utf8 只拥有 3 个字节。表情符号为 4 个字节。
猜你喜欢
  • 2011-02-09
  • 2019-04-06
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2012-12-12
  • 2018-10-17
  • 2015-03-08
相关资源
最近更新 更多