0

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。あらゆる種類のものが壊れる可能性があります。

4

1 に答える 1

1

間違いなく値を UTF-8 に変換し、UTF-8 接続エンコーディングを使用する必要があります。そうしないと、アプリケーションは ISO-8859-1 に含まれる文字しか送受信できないため、アプリケーションは UTF-8 をまったく利用できません。これは、Unicode ☹ に比べて非常に少ない量です。


それはあなたの問題とは無関係です*、unicode_ci照合でîは、と同じと見なされiます。それらを異なる文字と見なす必要がある場合は、他の照合を使用します。

SELECT 'î' = 'i' COLLATE 'utf8_unicode_ci'
//1

SELECT 'î' = 'i' COLLATE 'utf8_bin'
//0

ドイツ語の**照合はありませんので、utf8_binここで必要なものだと思います。


*宣言された接続エンコーディングが、送信する物理バイトのエンコーディングと一致しない場合にのみ問題があります。IE UTF-8 接続エンコーディングで ISO-8859-1 バイトを送信すると、エラーではないにしてもがらくたが発生します。およびその逆。

**私はあなたのプロフィールからそれを調べました.実際に他の言語が必要な場合は、そのための照合があるかもしれません.

于 2013-03-22T18:16:52.423 に答える