为了账号安全,请及时绑定邮箱和手机立即绑定

PHPPDO:字符集,设置名称?

PHPPDO:字符集,设置名称?

江户川乱折腾 2019-07-02 16:36:07
PHPPDO:字符集,设置名称?我以前在正常的MySQL_*连接中有过这样的情况:mysql_set_charset("utf8",$link);mysql_query("SET NAMES 'UTF8'");我需要它吗?我应该把它放在哪里?$connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
查看完整描述

4 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

将它放在连接字符串中,如下所示:

"mysql:host=$host;dbname=$db;charset=utf8"

但是,在PHP 5.3.6之前,Charset选项被忽略了。如果您运行的PHP版本较早,您必须这样做:

$dbh = new PDO("mysql:$connstr",  $user, $password);$dbh->exec("set names utf8");


查看完整回答
反对 回复 2019-07-02
?
函数式编程

TA贡献1807条经验 获得超9个赞

在PHP 5.3.6之前,Charset选项被忽略了。如果您运行的PHP版本较早,您必须这样做:

<?php

    $dbh = new PDO("mysql:$connstr",  $user, $password);

    $dbh -> exec("set names utf8");?>


查看完整回答
反对 回复 2019-07-02
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

这可能是最优雅的做法。
就在PDO构造函数调用中,但避免使用bug字符集选项(如上所述):

$connect = new PDO(
  "mysql:host=$host;dbname=$db", 
  $user, 
  $pass, 
  array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
  ));

对我很有用。


查看完整回答
反对 回复 2019-07-02
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

为了完整起见,实际上从PDO连接到MySQL时设置编码的方法以及可用的编码方式取决于PHP版本。优先次序是:

  1. charset

    参数在DSN字符串中。
  2. SET NAMES utf8

    带着

    PDO::MYSQL_ATTR_INIT_COMMAND

    连接选项
  3. SET NAMES utf8

    手动

此示例代码实现了这三种方法:

<?php

define('DB_HOST', 'localhost');define('DB_SCHEMA', 'test');define('DB_USER', 'test');define('DB_PASSWORD', 'test');define('DB_ENCODING', 'utf8');$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_SCHEMA;$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,);if( version_compare(PHP_VERSION, '5.3.6', '<') ){
    if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
        $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . DB_ENCODING;
    }}else{
    $dsn .= ';charset=' . DB_ENCODING;}$conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options);if( version_compare(PHP_VERSION, '5.3.6', '<') && !defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
    $sql = 'SET NAMES ' . DB_ENCODING;
    $conn->exec($sql);}

做这三件事可能是过分的(除非您正在编写您计划分发或重用的类)。


查看完整回答
反对 回复 2019-07-02
  • 4 回答
  • 0 关注
  • 858 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信