3

ここにコードがあります

mysql> SELECT id FROM tbl WHERE id = '1h';
+----+
| id |
+----+
|  1 |
+----+
1 row in set

実際、ID 1 のフィールドがあります (ただし、'1h' ではありません)。
以下は MySQL ドキュメントからの抜粋です: http://dev.mysql.com/doc/refman/5.1/en/type-conversion.html

mysql> SELECT 1 > '6x';
    -> 0
mysql> SELECT 7 > '6x';
    -> 1

したがって、このバグは文書化されています。問題は、そのような動作の理由と、これを char 記号で文字列をキャストしないように修正する方法です。すべてのフィールド値を次のようにキャストできます

mysql> SELECT id FROM tbl WHERE cast(`id`, BINARY) = '1h';

しかし、私はこの変種があまり好きではありません

4

2 に答える 2

3

これはバグではありません。

解決策は、条件の文字列値を使用して数値列を照会しないことです。

暗黙の型キャストに依存しないでください。

于 2012-07-06T16:11:40.563 に答える
0

あなたの観察はどれもバグではありません。それらは、暗黙的な型キャストに依存した結果です。

すべての例で、MySQL が文字列を int に変換する必要があります。リンク先のページを読むと、MySQL がこれを達成するためにいくつかの規則に従っていることがわかります。結果として

'1h' -> 1
'6x' -> 6
'x6' -> 0

したがって、これらのルールを守れば問題ありません。

さらに良いことに、これらの変換を実行する必要がある場所に MySQL を配置しないでください。このような状況は、通常、システムの他の場所に何らかの論理バグがあることを示しています。

于 2012-07-06T16:19:01.513 に答える