2016-07-05 102 views
2

Dies:Warum verursacht das Vergleichen von Typen in MYSQL keinen Fehler?

SELECT * FROM table WHERE comlumn1 = column2; 

liefert Ergebnisse. Diese

:

SELECT * FROM table WHERE column1 != column2; 

zurück nichts, obwohl es Zellen in den Spalten sind, die beiden Anfragen erfüllen.

Es stellte sich heraus, dass Spalte1 eine varchar und Spalte2 eine int war.

Meine Frage ist warum hat es keinen Fehler? Warum sollte man Ergebnisse zurückgeben und nicht die anderen? Wenn die Typen unterschiedlich sind, sind sie sicherlich immer nicht gleich?

UPDATE:

Die Werte in column1 waren varchars wie 1234-34 und column2 hatte ints wie 1234. Dies bedeutet, dass es immer übereinstimmen würde, weil es die varchar1234-34 in 1234 würde.

+3

http://stackoverflow.com/questions/4147215/how-int-database-field-gets-compared-to-varchar-type – MusicLovingIndianGirl

+1

@MusicLovingIndianGirl Dank. Das ist ähnlich, aber vor den Antworten hätte ich nicht nach einer solchen Frage gesucht. Ich würde auch nicht argumentieren, dass Leute nach dieser Frage suchen würden. Auch meine Frage war _why_ gibt es keinen Fehler nicht _how_ die Typen verglichen werden. Ich denke, es ist eine andere Frage – Adzz

Antwort

1

Beim Vergleich einer Zeichenfolge mit einer Zahl versucht MySQL, die Zeichenfolge in eine Zahl zu konvertieren, um den Vergleich durchzuführen.

Wenn nicht möglich, ist das Zahlenergebnis der Zeichenfolge 0.

Beispiele:

string value | int value | comparison result 
'abc'   | 1   | 0 = 1 -> false 
'1'   | 1   | 1 = 1 -> true 
'1abc'  | 1   | 1 = 1 -> true 
'abc1'  | 1   | 0 = 1 -> false 
1

Wenn Sie eine Zeichenfolge und eine Ganzzahl in MySQL vergleichen, konvertiert MySQL die Zeichenfolge in eine Ganzzahl. Die spezifischen Regeln sind in der documentation beschrieben. In Ihrem Fall werden diese als Fließkommazahlen verglichen.

Es ist einfach, die ganze Zahl in eine Gleitkommazahl zu konvertieren. Die konvertierte Zeichenkette verwendet implizite Konvertierung - die erste in der Zeichenkette gefundene Zahl wird konvertiert. Wenn es keine gibt, ist der Wert Null. So wird '12.3abc'12.3; 'abc' wird 0.

Dies ist wahrscheinlich, warum die Vergleiche fehlschlagen. Allerdings würde ich erwarten, dass die = fehlschlägt, aber die <> zum Erfolg.

+0

Danke tolle Antwort, aber @juergen d bekam zuerst – Adzz