web-dev-qa-db-ja.com

PDO + MySQLおよび壊れたUTF-8エンコーディング

PHPのMySQLデータベースでPDOライブラリを使用しますが、アラビア語のように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を使用してフェッチ後にデータをデコードします。これが今の私のやり方です。

27
Jason4Ever

使用する:

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

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

124
shark555

接続に正しい文字セットを設定する必要があります。 charset=utf8 DSNのオプション (これはMySQL固有です!)

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

ただし、PHP 5.3.6より前のバージョンでは、charsetオプションはサポートされていないため、回避策を使用する必要があります。

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

次のようなすべての試み:

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は、データベースにデータを挿入する前に使用されていました。 キリル文字は完全に破壊されました。

3
bbe

Php.iniのdefault_charset値をUTF-8に設定してみてください。または、 ini_set 関数を使用して設定できます。

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

2
Burak Guzel