PDO ... SET NAMES utf8 危险吗?
Is PDO ... SET NAMES utf8 dangerous?
看这里:http://www.php.net/manual/en/mysqlinfo.concepts.charset.php
我知道使用
SET NAMES utf8
不是一个好主意,但不清楚:
- 问题是什么?
- 如何避免?
- 在 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 开始可用。
看这里:http://www.php.net/manual/en/mysqlinfo.concepts.charset.php
我知道使用
SET NAMES utf8
不是一个好主意,但不清楚:
- 问题是什么?
- 如何避免?
- 在 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 开始可用。