PHP で ISO-8859-1 でエンコードされたファイルから値を読み取り、PDO を使用してエンコードされutf8_unicode_ci
、一意のインデックスを持つデータベース テーブルに値を書き込む必要があります。データに特殊文字が欠落している場合があり、重複キー エラーが発生することがあります。例: データには「エントレインメント」と「エントレインメント」が含まれています。これを回避するために使用できる PHP 文字列関数はありますか?
値が既に挿入されているかどうかを確認するために配列全体を反復処理する必要がないように、変換関数が望ましいです。
これが私がやろうとしていることの例です:
$values = array("Entraînement", "Entrainement");
$db = new PDO("mysql:dbname=mydb;host=localhost;charset=utf8", "user", "pw");
$db->exec("SET NAMES 'UTF-8'");
$stmt = $db->prepare("INSERT INTO mytable(myvalue) VALUES(?)");
$already_inserted = array();
foreach($values as $v) {
$v = $v_inserted = iconv('iso-8859-1', 'utf-8', $v);
// Do magic string conversion here
// $v_inserted = collation_convert($v_inserted)
if(isset($already_inserted[$v_inserted])) {
continue;
}
if($stmt->execute(array($v))) {
$already_inserted[$v_inserted] = true;
}
}
この例では、「エントレインメント」のみを挿入し、「エントレインメント」をスキップする必要があります。
元のプログラムでは、PDO の代わりに Doctrine ORM を使用しているため、SQL で多くのことができます。また、Latin1 の範囲全体 (フランス語、ドイツ語、スペイン語など) に特別な文字があります。
e コマース パッケージの一部であるため、DB フィールド定義を に変更できませんutf8_bin
。あらゆる種類のものが壊れる可能性があります。