私は以前これを通常の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));
私は以前これを通常の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));
回答:
次のように接続文字列に含めます。
"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");
PHP 5.3.6より前は、charsetオプションは無視されていました。古いバージョンのPHPを実行している場合は、次のようにする必要があります。
<?php
$dbh = new PDO("mysql:$connstr", $user, $password);
$dbh -> exec("set names utf8");
?>
これはおそらく、最もエレガントな方法です。
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"
)
);
私にとってはうまくいきます。
array(1002 => 'SET NAMES utf8',...)
。
charset=utf8
dsn文字列を渡すと動作します!groups.google.com/d/msg/auraphp/syMS26Rz-q8/9laQr9tR4EoJ
完全を期すために、PDOからMySQLに接続するときに実際にエンコードを設定する方法は3つあり、どの方法を使用できるかは、PHPのバージョンによって異なります。優先順位は次のとおりです。
charset
DSN文字列のパラメータSET NAMES utf8
してPDO::MYSQL_ATTR_INIT_COMMAND
接続オプション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);
}
3つすべてを実行するのはおそらくやりすぎです(配布または再利用する予定のクラスを作成している場合を除きます)。
COLLATE utf8_general_ciまたは使用したい照合順序でデータベースが作成されていることを確認する必要があることを付け加えておきます。そうしないと、意図したものとは別の照合順序になる可能性があります。
phpmyadminでは、データベースをクリックして操作を選択すると、照合順序を確認できます。データベースとは別の照合順序でテーブルを作成しようとすると、テーブルはとにかくデータベース照合になります。
したがって、テーブルを作成する前に、データベースの照合順序が正しいことを確認してください。これが誰かを数時間救うことを願っています笑
DSNの文字セットオプションは実際には無視されるため、追加のクエリが必要だと思います。他の回答のコメントに投稿されたリンクを参照してください。
http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7で Drupal 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');
}
$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
私はこのコードをテストし、
$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'];
}
$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 );