Wenn ein Operator mit Operanden verschiedener Typen verwendet wird, findet eine Typenkonvertierung statt, um die Operanden kompatibel zu machen. Einige Konvertierungen treten implizit auf. So wandelt MySQL beispielsweise Zahlen nach Bedarf in Strings um und umgekehrt.
mysql>SELECT 1+'1';
-> 2 mysql>SELECT CONCAT(2,' test');
-> '2 test'
Es ist auch möglich, explizite Konvertierungen durchzuführen.
Wenn Sie eine Zahl explizit in einen String umwandeln wollen,
verwenden Sie die Funktionen CAST()
oder
CONCAT()
(wobei CAST()
vorzuziehen ist):
mysql>SELECT 38.8, CAST(38.8 AS CHAR);
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT(38.8);
-> 38.8, '38.8'
Die folgenden Regeln beschreiben, wie die Konvertierung bei Vergleichsoperationen erfolgt:
Wenn eines der Argumente (oder beide)
NULL
ist, dann ist das Vergleichsergebnis
NULL
. Eine Ausnahme ist der
NULL
-sichere Gleichheitsoperator
<=>
. Bei NULL <=>
NULL
ist das Ergebnis wahr.
Wenn beide Argumente in einer Vergleichsoperation Strings sind, werden sie als Strings verglichen.
Sind beide Argumente Integers, dann werden sie als Integers verglichen.
Hexadezimalwerte werden als binäre Strings behandelt, wenn sie nicht mit einer Zahl verglichen werden.
Wenn eines der Argumente eine TIMESTAMP
-
oder DATETIME
-Spalte und das andere
Argument eine Konstante ist, dann wird die Konstante vor
Durchführung des Vergleichs in einen Zeitstempel
umgewandelt. Dies erhöht die ODBC-Kompatibilität. Beachten
Sie jedoch, dass dies nicht bei Argumenten für
IN()
gemacht wird! Um ganz sicher zu
sein, sollten Sie bei Vergleichen immer vollständige
Strings für Datum und/oder Uhrzeit verwenden.
In allen anderen Fällen werden die Argumente als Fließkommazahlen (reale Zahlen) verglichen.
Die folgenden Beispiele veranschaulichen die Konvertierung von Strings in Zahlen für Vergleichsoperationen:
mysql>SELECT 1 > '6x';
-> 0 mysql>SELECT 7 > '6x';
-> 1 mysql>SELECT 0 > 'x6';
-> 0 mysql>SELECT 0 = 'x6';
-> 1
Beachten Sie, dass, wenn Sie eine String-Spalte mit einer Zahl
vergleichen, MySQL keinen Index für die Spalte verwenden kann,
um den Wert schnell abzurufen. Ist
str_col
eine indizierte
String-Spalte, dann kann der Index nicht verwendet werden, um
für die folgende Anweisung eine Suche durchzuführen:
SELECT * FROMtbl_name
WHEREstr_col
=1;
Dies liegt daran, dass es viele verschiedene Strings gibt, die
in den Wert 1
konvertiert werden:
'1'
, ' 1'
,
'1a'
, …
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.