2017-09-08 5 views
0

ich eine Abfrage haben, die Tippfehler:MySQL Bug in Where-Klausel?

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

es sein sollte:

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

Aber die erste falsche Abfrage, die so_number = '1m' auf mysteriöse Weise haben richtig ausgibt, die gleiche Ausgabe wie die zweite richtige Abfrage tut , was nicht der Fall sein sollte, oder?

product_id und so_number Datentypen sind beide INT. so_number = '1m' sollte funktionieren, wenn der Datentyp so_numberVARCHAR ist, da ich die 1m in Anführungszeichen eingeschlossen habe, und die Bedingung war so_number LIKE '%1m%'.

Warum funktioniert die obige Tippfehlerabfrage? Sollte nicht MySQL Fehler und sagt, dass es die 1m nicht finden und es als 1 betrachten kann? Ist das ein bekannter Fehler? Ich benutze MySQL 5.6.14.

Hier ein Screenshot:

enter image description hereenter image description here

+0

Zum Vergleich MySQL hat konvertieren ' '1m'' auf eine ganze Zahl: Sie können über das here lesen. Das Beste, was es tun kann, ist "1". –

+0

Ah, also liest es nicht das Zeichen 'm', obwohl ich sie in Anführungszeichen eingeschlossen habe? – xjshiya

+0

Anführungszeichen sind Zeichenfolgen, sie sind nicht dazu gedacht, Dinge zu gruppieren, wie bei Online-Suchen. Wenn MySQL die Zeichenkette ''1m'' in eine Ganzzahl umwandelt, die es zu vergleichen braucht, stoppt es, wenn es das nicht-numerische '' m'' findet, so dass es nur die Ganzzahl' 1' findet. –

Antwort

3

Es ist implizite Konvertierung, durchgeführt von MySQL.

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

z.B .:

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

Das ist die Erklärung, die ich suche. Vielen Dank! – xjshiya

+1

Implizite Konvertierung ist in Ordnung, aber "partielle Konvertierung" von Strings wie '2m' kann zu unerwarteten Ergebnissen führen - der Oracle-DB gibt in solchen Fällen einen Fehler aus. Zumindest ein unerwartetes Verhalten in MySQL, IMHO ... –