1

次の問題があります(mysql 5.0.70を使用)。

あるテーブルにはvarchar、次のようなある種の数値を含むフィールドがあります。

"0303A342", "21534463", "35663CE3"

等。 照合は に設定されていutf8_general_ciます。

システムのユーザーがこの番号の一部を含むレコードを検索しようとすると、問題が発生します。SQLクエリは次のようになります

...
WHERE 'number' LIKE '%0303A%'

LIKE 部分の 'A' が A として入力されたLatin場合、結果には A を含むレコードのみが含まれますLatin。A が のCyrillic場合、結果は再び A を含む行のみになりますCyrillic。E、C、B、T など、他にも多くの文字があります。

ここで私の質問は、SQLクエリを変更して、そのLIKE '%0303A%'部分に一致するすべての行を返す方法があるかどうかですが、そこにあるすべての種類のA`に対してですか? または、データベースを挿入/更新する前にユーザー入力を変換する必要がありますか?

4

3 に答える 3

1

LOOKS LIKEユーザー入力を変換する必要があります。関数はありませんMySQL:)

音訳された文字列を元の文字列と一緒に保存し、php::translitを使用してこれを行うことができます。

IDデータtrans_data
1 Москва MOSKVA
2 София SOFIA
SELECT  *
FROM    table
WHERE   trans_data LIKE CONCAT('%', ?, '%')

mysqli->bind_param('s', strtoupper(transliterate('Москва')));
于 2009-06-15T12:45:33.263 に答える
0

いくつかの文字がいくつかのアルファベットで似ているという事実は、それらを同一にするわけではありません. 実際、それらの外観は、表示に使用されるフォントによって異なる場合もあります。

サンプル データは 16 進数値のように見えます。問題のコンテキストについて詳しく知らなくても、ユーザーにデータを 10 進形式で (数字のみを使用して) 入力させることは可能でしょうか? もう 1 つの可能性は、検索条件を入力するためのカスタム コントロールです。それは自由なテキストである必要がありますか、それともいくつかのオプションを持つリストボックスで十分でしょうか?

そうでない場合は、使用している言語またはライブラリで、Quassnoi が説明するもの (transliterate()) と同様の関数が見つかる可能性があります。プレーンな MySQL では、おそらく運が悪いでしょう。そして、あなたが望むことをする機能を見つけたとしても、それがあなたのユーザーが使用しようとしているすべての言語/アルファベットをサポートしていることを確認してください.ラテンのもの。

于 2009-06-15T13:10:36.917 に答える
0

PHP トランスリットを使用できません - 私が扱っているデータ (私が「数字」と呼んでいる) はある種の識別子であるため、誰かが「 Я」。ユーザーがラテン文字とキリル文字のみを使用することがわかっているため、2 つのアルファベットの一般的な文字のリストを作成し、データベースに到達する前にユーザー入力を変換します。ちょっと面倒ですが、最も適切な解決策のようです。

于 2009-06-19T11:46:00.003 に答える