6

varchar を utf8 MySQL テーブルに格納し、utf8_general_ci 照合を使用しています。varchar に一意のインデックスがあります。MySQL がインデックスに対して行うことと同等の文字列比較を PHP で行いたいと考えています。

特定の例は、これが起こる前に、PHP で 'a' が 'À' と同等であると見なされることを検出できるようにしたいということです。

mysql> insert UniTest (str) values ('a');                                   
Query OK, 1 row affected (0.00 sec)

mysql> insert UniTest (str) values ('À');                                   
ERROR 1062 (23000): Duplicate entry 'À' for key 1
4

5 に答える 5

9

照合はストレージとは何の関係もありません。ストレージエンコーディングを決定するには、文字セットを設定する必要があります。照合は、比較と並べ替えがどのように行われるかを決定します。照合は文字セットを認識している必要がありますが、それ以外の場合は文字セットとは関係ありません。

あなたの質問に答えるために、あなたiconvはテキストを転記し、そしてそれを比較するために使うことができます。例えば:

function compare($s1, $s2) {
  return strcmp(
    iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $s1),
    iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $s2));
}

これは基本的にMySqlが行うことですが、おそらくより高速で、照合テーブルが。とは少し異なる場合がありますISO-8859-1//TRANSLIT。それについては完全にはわかりません。

他の人がすでに示唆しているように、データベースを使用する方がおそらく簡単でしょう。

于 2009-01-23T09:25:57.633 に答える
1

同じキーを持つレコードが既に存在するかどうかを MySQL に判断させてみませんか?

SELECTこの属性を持つレコードが既に存在するかどうかを尋ねるクエリを実行できます。

SELECT 1
FROM UniTest
WHERE str = "À"

または、新しいレコードを挿入してみて、関数mysql_error()およびmysql_errno()を使用して、エラーが発生したかどうかを確認します。

于 2009-01-22T22:14:20.343 に答える
1

次のようなクエリを MySQL に送信することで、MySQL に作業を任せることが合理的でしょうか?

SELECT CASE WHEN '$a' = '$b' THEN 1 ELSE 0 END


編集後の説明:

それ自体に結合された関心のあるデカルトの文字セット全体を一度に反復処理し、等価セットの標準的な php 連想配列を構築できます。

    $charset の $char1 ごとに {  
        $charset の $char2 ごとに {  
            $charmatch[$char1][$char2] = mysqlTestMatch($char1, $char2));  
        }  
    }  

次に、各文字列を文字ごとにテストして、a) それらが同じかどうか、またはそうでない場合は b) 同等かどうかを確認する必要があります。

于 2009-01-22T22:10:59.993 に答える
0

intl の Collat​​or または Transliterator を使用します。

$s1 = 'a';
$s2 = 'À';

var_dump(
    is_same_string($s1, $s2),
    $s1 === transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', $s2)
);

function is_same_string($str, $str2, $locale = 'en_US')
{
    $coll = collator_create($locale);
    collator_set_strength($coll, Collator::PRIMARY);  
    return 0 === collator_compare($coll, $str, $str2);
}
于 2013-09-19T07:50:34.953 に答える
0

それで、私が正しく理解できれば、MySQL で UTF-8 の一般的なインデックス チェックと照合するのと同じように、PHP で同様の比較をしたいですか?

最も簡単な方法は、MySSQL で使用される utf8_general_ci 規則に従って文字列を変換するヘルパー関数を作成することです。これは、主に特定の文字を基本文字に変換することです。

その MySQL 照合のルールは次のとおりです。

http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html

たとえば、左側の「金色の A」まで少し下にスクロールすると、その A に変換されるすべての文字が表示されます。

たとえば と呼ばれるヘルパー関数が与えられた場合utf8g_to_ascii()、次の関数を作成できます。

function utf8_compare($s1, $s2) {
   $a = utf8g_to_ascii($s1);
   $b = utf8g_to_ascii($s2);
   return strcmp( $a, $b );
}

私は自分のコードを次のようにモデル化します:

http://dev.splitbrain.org/view/darcs/dokuwiki/inc/utf8.php
于 2009-02-04T20:33:11.993 に答える