8

私はテーブルを持っています:

CREATE TABLE `ids` (
    id int(11) not null auto_increment,
    PRIMARY KEY (id)
);

111、112、113、114 などの ID が含まれています。

私はクエリを作成しました:

SELECT * FROM `ids` WHERE id = '112abcdefg'

何も期待していませんでしたが、ID が 112 の行という結果が得られました。MySQL は静かに文字列を整数に変換し、列の値と比較したようです。

id列から同じ文字列をクエリしても期待どおりの結果が得られないようにクエリを変更するにはどうすればよいですか? MySQL に厳密な比較修飾子はありますか?

4

4 に答える 4

5

1 つのオプションはCAST112toCHARを使用して適切な一致を取得することです。

WHERE CAST(id AS CHAR(12)) = '112abcdefg'

イン12CHAR推測です。それはあなたの最大のid.

それはおそらく最適化の可能性を殺してしまうので、別のオプション (100% 確実ではありませんが) はBINARY比較を使用することです。いくつかの異なる値でこれを試してみましたが、うまくいきます:

WHERE BINARY id = '112abcdefg'
于 2013-05-29T18:14:00.397 に答える
1

これを使用できます:

SET sql_mode = STRICT_TRANS_TABLES;

これにより、SQLモードが厳密なチェックに設定され、言及したクエリを起動してみてください。

于 2013-05-29T18:13:14.363 に答える
1

lame + は最適化を無効にしますが、目的を果たします

SELECT * FROM `ids` WHERE concat(id) = '112abcdefg';

そうすれば、文字列へのキャストを強制できます http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

于 2013-05-29T18:24:27.510 に答える