2017-09-08 10 views
0

私はタイプミスを持つクエリを持っている:where節のMySQLバグ?

SELECT 
    SUM(qty) 
AS 
    'aqty1' 
FROM 
    po_details 
WHERE 
    product_id ='1196' 
AND 
    so_number = '1m'; 

は、それは次のようになります。

SELECT 
    SUM(qty) 
AS 
    'aqty1' 
FROM 
    po_details 
WHERE 
    product_id ='1196' 
AND 
    so_number = '1'; 

しかしso_number = '1m'が神秘的に正しく出力していまず間違ったクエリ、二正しいクエリと同じ出力を行いますこれは当てはまらないはずですよね?

product_idso_numberのデータ型はともにINTです。私が1mを引用符で囲んでいて、条件セットがso_number LIKE '%1m%'だったので、so_numberのデータタイプがVARCHARの場合、so_number = '1m'は機能するはずです。

なぜ上記の誤植は機能しますか? MySQLエラーではなく、1mを見つけられず、1と考えていますか?これは既知のバグですか?私はMySQL 5.6.14を使用しています。

enter image description hereenter image description here

+0

:あなたはhere約読むことができます。最高のことは '1'です。 –

+0

ああ、私はそれらを引用符で囲んでも、文字 'm'を読みませんか? – xjshiya

+0

引用符は文字列の記号であり、オンライン検索のようにグループ化するものではありません。 MySQLが文字列 ''1m'を整数に変換する場合、それを比較するためには整数ではなく、数値でない' 'm ''が見つかると停止し、整数 '1'しか見つけません。 –

答えて

3

これは、MySQLによって行わ暗黙的な変換、です:

は、ここでのスクリーンショットです。 MySQLは `整数に1m'`を変換する必要があり比較するには

When an operator is used with operands of different types, type conversion occurs to make the operands compatible. Some conversions occur implicitly.

例えば:

mysql> SELECT 1+'1'; 
     -> 2 
mysql> SELECT CONCAT(2,' test'); 
     -> '2 test' 
+0

これは私が探している説明です。ありがとう! – xjshiya

+1

暗黙の変換は問題ありませんが、 '2m'のような文字列の「部分変換」は予期しない結果につながる可能性があります.Oracle DBではこのような場合にエラーが発生します。少なくともMySQL、IMHOの予期しない動作... –