2

顧客の Web サイトの柔軟な検索メカニズムを作成しています。ユーザーが入力した文字列値を検索するために、ユニオン句を使用してデータベース内のさまざまなフィールドを照会しています。これは、1 つの問題を除いて正常に機能します。

テキストの文字列を現在ゼロに設定されている整数と比較すると、一致は常に true を返します。つまり、MySQL によると、「email@example.com」は 0 に等しいということです。

CAST 関数と CONVERT 関数を利用して、これを標準の文字列と文字列の比較に変換しようとしましたが、正しい構文を取得できないようです。私の試みは、上記の問題を繰り返すか、一部が一致するはずの行をまったく返さないかのいずれかです。また、多くのユニオンを組み合わせているため、これを行うとパフォーマンスに影響することも懸念されます。

私が本当に必要としているのは、入力された文字列とデータベース内の値 (整数または文字列) との厳密な比較です。

編集:これは例です。

CREATE  TABLE `test_table` (
`id` INT NOT NULL AUTO_INCREMENT ,
`email` VARCHAR(255) NOT NULL ,
`phone` BIGINT(19) NOT NULL DEFAULT '0' ,
PRIMARY KEY (`id`) )
ENGINE = MyISAM;

INSERT INTO `test_table` (`id`, `email`, `phone`) VALUES (1, 'email@example.com', 0);

SELECT * FROM test_table WHERE phone = 'email@example.com';

これを実行すると、挿入された 1 行が返されます。私の問題は、そうすべきではないということです!

4

2 に答える 2

1

このクエリは失敗するはずです:

SELECT * FROM test_table WHERE cast(phone as char) = 'email@example.com';

元の問題の原因は、文字列と数値を比較するときに、文字列を数値に変換することです (したがって、 と書くことができますwhere phone = '123')。このデフォルトの変換を防ぐには、フィールドの明示的なキャストを使用して文字列間の比較を行う必要があります。

残念ながら、このようにキャストすると、インデックスを使用できなくなる可能性があります。フィールドがすでにcharであっても、キャストによってインデックス作成が妨げられているようです。

入力の検証中に解決することもできますphone。 が整数の場合、ユーザーが検索フィールドに整数以外の値を入力できないようにします。

于 2013-05-20T16:54:14.813 に答える
-1

置き換えてみてはどうですか:

SELECT * FROM test_table WHERE phone = 'email@example.com'

と:

SELECT * FROM test_table WHERE phone = 'email@example.com' and phone <> 0

<> は異なることを意味します。

電話番号がないことを意味するために phone 列に 0 を使用しているため、これはうまくいきます (ただし、電話番号がない場合は NULL を使用する方が適切です)。

于 2013-05-20T16:54:08.360 に答える