PHP PDO:charset,设置名称?

时间:2010-12-05 21:54:01

标签: php mysql pdo

我之前在普通的mysql_ *连接中有过这个:

mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");

我是否需要PDO?我应该在哪里买到它?

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

11 个答案:

答案 0 :(得分:421)

您可以在连接字符串中使用它:

"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");

答案 1 :(得分:61)

在PHP 5.3.6之前,忽略了charset选项。如果您运行的是旧版本的PHP,则必须执行以下操作:

<?php

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

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

?>

答案 2 :(得分:40)

这可能是最优雅的方式 在PDO构造函数调用中,但避免了错误的charset选项(如上所述):

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

非常适合我。

答案 3 :(得分:16)

为了完整性,当从PDO连接到MySQL时,实际上有三种方式来设置编码,哪些可用,取决于您的PHP版本。优先顺序为:

    DSN字符串中的
  1. charset参数
  2. 使用SET NAMES utf8连接选项
  3. 运行PDO::MYSQL_ATTR_INIT_COMMAND
  4. 手动运行SET NAMES utf8
  5. 此示例代码实现了所有三个:

    <?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);
    }
    

    做这三件事可能有点过头了(除非你正在编写一个你打算分发或重复使用的课程。)

答案 4 :(得分:2)

我认为您需要额外的查询,因为DSN中的charset选项实际上已被忽略。请参阅其他答案的评论中发布的链接。

看看Drupal 7是如何在http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7中完成的:

// Force MySQL to use the UTF-8 character set. Also set the collation, if a
// certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
// for UTF-8.
if (!empty($connection_options['collation'])) {
  $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
}
else {
  $this->exec('SET NAMES utf8');
}

答案 5 :(得分:2)

我只想补充一点,你必须确保你的数据库是用COLLATE utf8_general_ci创建的,或者是你想要使用的任何一种排序规则。否则你最终可能会得到另一个而不是预期的。

在phpmyadmin中,您可以通过单击数据库并选择操作来查看排序规则。如果您尝试使用除数据库之外的其他排序规则创建表,那么您的表最终将以数据库排序规则结束。

因此,在创建表之前,请确保数据库的排序规则正确。希望这可以节省几个小时的人lol

答案 6 :(得分:1)

就我而言,我必须添加这一行:

$conn->exec("set names utf8"); //Support utf8

它的外观:

$conn = new PDO("mysql:host=$servername;dbname=$db", $username, $password);
$conn->exec("set names utf8"); //Support utf8

答案 7 :(得分:0)

$con="";
$MODE="";
$dbhost = "localhost";
$dbuser = "root";
$dbpassword = "";
$database = "name";

$con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   

答案 8 :(得分:0)

$ con = new PDO(“mysql:host = $ dbhost; dbname = $ database; charset = $ encoding ”,“$ dbuser”,“$ dbpassword”);

答案 9 :(得分:0)

我测试了这段代码和

$db=new PDO('mysql:host=localhost;dbname=cwDB','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$sql="select * from products  ";
$stmt=$db->prepare($sql);
$stmt->execute();
while($result=$stmt->fetch(PDO::FETCH_ASSOC)){                  
    $id=$result['id'];
}

答案 10 :(得分:0)

$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);