PHP PDO:charset,设置名称?

Kar*_*rem 181 php mysql pdo

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

mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");
Run Code Online (Sandbox Code Playgroud)

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

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

Cob*_*ast 440

您将在连接字符串中拥有它,如:

"mysql:host=$host;dbname=$db;charset=utf8"
Run Code Online (Sandbox Code Playgroud)

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

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

  • shoudle是utf8 instaead的UTF-8"mysql:host = $ host; dbname = $ db; charset = utf8" (15认同)
  • 值得注意的是,这种行为在5.3.6中发生了变化,现在正在正常运行. (14认同)
  • 在这种情况下,我是否还必须指定排序规则?比如'SET NAMES utf8 COLLATE utf8_unicode_ci'? (4认同)
  • 如果您使用的是最新版本的PHP,请忽略以下答案:它在php 5.3.8中运行正常. (3认同)
  • 从 utf8 切换到 utf8mb4。 (3认同)
  • 谢谢!救了我的一天! (2认同)

9ni*_*x00 62

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

<?php

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

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

?>
Run Code Online (Sandbox Code Playgroud)

  • mods 注意:这是正确的答案,它是在接受的答案将这些信息编辑到其中的一年前发布的。 (2认同)

Jps*_*psy 41

这可能是最优雅的方式.
在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"
  )
);
Run Code Online (Sandbox Code Playgroud)

对我来说很棒.

  • 我认为没有数据库特定选项可能会更优雅 (3认同)

Álv*_*lez 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 哦,永远不要定义您的数据库密码.它们像超级全球一样全球化,当你使用密码时,这不是一件好事. (2认同)