web-dev-qa-db-ja.com

PHP 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));
177
Karem

あなたはあなたの接続文字列のようにそれを持っているでしょう:

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

ただし、PHP 5.3.6より前のバージョンでは、文字セットオプションは無視されていました。古いバージョンのPHPを実行している場合は、次のようにする必要があります。

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

PHP 5.3.6より前では、文字セットオプションは無視されていました。古いバージョンのPHPを実行している場合は、次のようにする必要があります。

<?php

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

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

?>
61
9nix00

これはおそらく最もエレガントな方法です。
PDOコンストラクター呼び出しの右側にありますが、(上記のように)バグのある文字セットオプションは避けてください。

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

私にとっては素晴らしい作品です。

40
Jpsy

完全を期すために、PDOからMySQLに接続するときにエンコーディングを設定する方法は実際にはあり、使用可能な方法はPHPバージョンによって異なります。優先順位は次のようになります。

  1. DSN文字列のcharsetパラメータ
  2. SET NAMES utf8接続オプションを指定してPDO::MYSQL_ATTR_INIT_COMMANDを実行する
  3. 手動でSET NAMES utf8を実行する

このサンプルコードは、3つすべてを実装しています。

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

つすべてをやるのはやり過ぎです(あなたが配布または再利用する予定のクラスを書いているのでない限り)

16

DSNのcharsetオプションは実際には無視されるため、追加のクエリが必要だと思います。他の回答のコメントに掲載されているリンクを参照してください。

http://api.drupal.org/api/drupal/includes-- database - mysql - data.inc/functions/DatabaseConnection_mysql%3A%3A__construct/でDrupal 7がどのようにそれを行っているかを調べてください。 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');
}
2
Berdir

私はあなたのデータベースがCOLLATE utf8_general_ciまたはあなたが使いたい照合のいずれかで作成されていることを確認しなければならないことを付け加えたいです。

Phpmyadminでは、データベースをクリックして操作を選択することで照合を見ることができます。データベースとは別の照合順序でテーブルを作成しようとすると、いずれにせよテーブルはデータベースの照合順序になります。

そのため、テーブルを作成する直前にデータベースの照合順序が正しいことを確認してください。これが誰かに数時間の節約を願っていますLOL

2
Medda86
$conn = new PDO("mysql:Host=$Host;dbname=$db;charset=utf8", $user, $pass);
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'];
}
0
elite andot

$ con = new PDO( "mysql:ホスト= $ dbhost; dbname = $データベース; charset = $ encoding"、 "$ dbuser"、 "$ dbpassword");

0
Dilmurod
$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 );   
0
Jayanit Satani