2017-04-25 13 views
0

Ich bin ein bisschen verwirrt dieseMySQL, gleich oder nicht gleich?

SELECT 1='1x'; 

auf MySQL zu sehen, gibt mir 1

Während

SELECT 1='2x'; 

gibt mir 0 (wie erwartet)

Wenn ein binäres tun vergleichen

SELECT CAST(1 AS BINARY)=CAST('1x' AS BINARY); 

es gibt mir 0 (auch wie erwartet)

Frage: Wie kann ich verhindern, dass MySQL so verhält? Ich möchte '=' als 100% gleichwertig wirken. Ich möchte nicht, dass MySQL annimmt oder rät, was ich vergleichen möchte.

+0

Die Werte nicht als Strings eingeben: https://dev.mysql.com/doc/refman/5.7/en/bit-value-literals.html. –

Antwort

4

Wenn Strings und Zahlen verglichen werden, führt MySQL automatisch eine Konvertierung durch.

Also die Zeichenfolge wird in eine Zahl umgewandelt und es beginnt von links nach rechts und versucht, eine Zahl daraus zu machen.

So

'1x' => 1 
'x1' => 0 //because it does not start with a number on the left 

Sie können nicht dieses Verhalten ändern. Und Sie sollten verschiedene Datentypen sowieso nicht vergleichen. Also ist es deine Schuld :)

+0

Danke für die Klärung. Ich war mir dessen nicht bewusst. Es ist das erste Mal, dass ich einen String mit ganzzahligen Werten vergleichen muss, wie es vom Datenbankschema definiert wird. Bin ich also auf der sicheren Seite, indem ich beide Werte als binär werte? Oder gibt es noch irgendwelche Einschränkungen, die ich berücksichtigen muss? – Juergen

+0

Ein Vergleich von '1 = '1x' ist einfach falsch. Wenn Sie wissen, dass auf einer Seite ein String ist, vergleichen Sie ihn mit einem String auf der anderen Seite. "1x" = "1x" –