2010-12-17 6 views
18

PHPでMySQLデータベースでPDOライブラリを使用していますが、アラビア語のようにUTF-8でエンコードされたデータを挿入すると、データベースに挿入されますが、?????????です。PDO + MySQLと壊れたUTF-8エンコーディング

私自身のフレームワークでは、PDO接続を作成した後、SET NAMES utf8SET CHARACTER SET utf8という2つのクエリを送信します。それでも動作しません。

例:

loadclass('PDO', array(
    sprintf(
     'mysql:host=%s;port=%s;dbname=%s', 
     confitem('database', 'host'), 
     confitem('database', 'port'), 
     confitem('database', 'name') 
    ), 
    confitem('database', 'username'), 
    confitem('database', 'password'), 
    array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect')) 
)); 
$this->query('SET NAMES ' . confitem('database', 'charset')); 
$this->query('SET CHARACTER SET ' . confitem('database', 'charset')); 

回避策:json_encode関数がデータベースに挿入する前にデータを変換し、フェッチした後、それを復号するjson_decodeを使用します。これが今私がやる方法です。

+0

これはPHPの問題ではないと確信していますか? mbstringがインストールされていることを確認しますか? – Rahly

+0

私は同じ文字列を送り返して、それが大丈夫かどうかを確認することをお勧めします。テストのように。 – s3v3n

+0

confitem( 'database'、 'charset')の値は何ですか? –

答えて

104

それはおそらく数年前に解決されていますが、将来の世代ために:

$pdo = new PDO( 
    'mysql:host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
); 

これは、PDO接続でUTF-8を強制します。私のために働いた。

+1

PDO :: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES' UTF8 ''がある場合 - 追加していないことを確認してください: - > exec( "SET CHARACTER SET utf8")... – Jeffz

2

php.iniのdefault_charsetの値をUTF-8に設定してみてください。または、ini_set機能を使用して設定することもできます。

また、入力がフォームの送信を経由している場合は、Webページがメタタグを使用してUTF-8に設定されていることを確認してください。

+0

こんにちは、私は試してみますが、私はこの問題を解決しません。 – Jason4Ever

+0

はい.. Webページからのデータをテストしました。はい、utf-8エンコーディングが付いていて、utf-8エンコーディングメタタグがあります。 – Jason4Ever

+0

Windowsマシンで同じ問題が発生しました。問題。すべてがUTF-8を話していた... PHPを除いて。 – v010dya

33

接続に正しい文字セットを設定する必要があります。 Add charset=utf8 option to the DSN.(これはMySQL固有である!)charsetオプションがサポートされていないよう

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName;charset=utf8', 
    'username', 
    'password' 
); 

しかし、5.3.6の下でPHPのバージョンでは、あなたは回避策を使用する必要があります。

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
); 
+3

既存の投票済みの回答を更新しようとしましたが、[私の編集は拒否されました](https://stackoverflow.com/review/suggested-edits/3904725)。したがって、新しい回答として投稿してください。 – Palec

+0

ありがとう! 'charset = utf8'' Datatableサーバー側で私の仕事 – mghhgm

+0

ありがとう! charset = utf8は私にとってこの非常に厄介な問題をソートしたものでした。 – Brigante

1

すべてのような試み:

PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' " 

または

$this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt); 

または

$this->connection->exec("set names utf8"); 

はまだ生成読めないテキストの混乱。

私の場合、問題の原因はデータベースにデータを挿入する前にhtmlentitiesでした。 キリル文字が完全に破壊されました。

関連する問題