PHPのMySQLデータベースでPDOライブラリを使用しますが、アラビア語のようにUTF-8でエンコードされたデータを挿入すると、?????????
としてデータベースに挿入されます。
私自身のフレームワークでは、PDO接続を作成した後、SET NAMES utf8
とSET 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
を使用してフェッチ後にデータをデコードします。これが今の私のやり方です。
使用する:
$pdo = new PDO(
'mysql:Host=hostname;dbname=defaultDbName',
'username',
'password',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
PDO接続でUTF-8を強制します。それは私のために働いた。
接続に正しい文字セットを設定する必要があります。 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")
);
次のようなすべての試み:
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
は、データベースにデータを挿入する前に使用されていました。 キリル文字は完全に破壊されました。
Php.iniのdefault_charset
値をUTF-8に設定してみてください。または、 ini_set 関数を使用して設定できます。
また、フォームの送信を通じて入力される場合は、メタタグを使用してWebページがUTF-8に設定されていることを確認してください。