Der Operator BINARY
wandelt den ihm
nachfolgenden String in einen Binär-String um. Dies ist eine
einfache Möglichkeit, einen Spaltenvergleich byte- statt
zeichenweise durchzuführen. Auf diese Weise unterscheidet der
Vergleich die Groß-/Kleinschreibung auch dann, wenn die
Spalte nicht als BINARY
oder
BLOB
definiert ist.
BINARY
berücksichtigt auch am Ende
stehende Leerzeichen.
mysql>SELECT 'a' = 'A';
-> 1 mysql>SELECT BINARY 'a' = 'A';
-> 0 mysql>SELECT 'a' = 'a ';
-> 1 mysql>SELECT BINARY 'a' = 'a ';
-> 0
In einem Vergleich wirkt sich BINARY
auf
die gesamte Operation aus. Es kann vor einen beliebigen
Operanden gesetzt werden – das Ergebnis bleibt stets das
Gleiche.
BINARY
ist
eine Abkürzung für
str
CAST(
.
str
AS
BINARY)
Beachten Sie, dass, wenn Sie in bestimmten Kontexten eine
indizierte Spalte in BINARY
umwandeln,
MySQL den Index nicht mehr effizient verwenden kann.
CAST(
,
expr
AS
type
)CONVERT(
,
expr
,type
)CONVERT(
expr
USING
transcoding_name
)
Die Funktionen CAST()
und
CONVERT()
nehmen einen Wert eines Typs
entgegen und erzeugen einen Wert eines anderen Typs.
type
kann einen der folgenden Werte
haben:
BINARY[(
N
)]
CHAR[(
N
)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
BINARY
erzeugt einen String des Datentyps
BINARY
. Eine Erläuterung, wie sich dies
auf Vergleiche auswirkt, finden Sie in
Abschnitt 11.4.2, „Die BINARY
- und VARBINARY
-Typen“. Wird die optionale Länge
N
angegeben, dann verwendet
BINARY[
zur
Umwandlung nicht mehr als N
]N
Bytes
des Arguments. Werte, die kürzer als
N
Bytes sind, werden mit
0x00
-Bytes auf die Länge
N
aufgefüllt.
Mit CHAR[
werden bei der Umwandlung nicht mehr als
N
]N
Zeichen des Arguments verwendet.
CAST()
und CONVERT(... USING
...)
sind SQL-Standardsyntax. Die Form von
CONVERT()
ohne USING
hingegen ist ODBC-Syntax.
CONVERT()
wird mit USING
zur Konvertierung von Daten zwischen verschiedenen
Zeichensätzen konvertiert. Bei MySQL sind die
Transkodierungs- mit den entsprechenden Zeichensatznamen
identisch. Die folgende Anweisung beispielsweise konvertiert
den String 'abc'
im Standardzeichensatz in
den entsprechenden String im Zeichensatz
utf8
:
SELECT CONVERT('abc' USING utf8);
Normalerweise können Sie einen BLOB
-Wert oder
einen anderen binären Wert nur mit Unterscheidung der
Groß-/Kleinschreibung vergleichen, da Binär-Strings keinen
Zeichensatz (und deswegen auch keine Groß-/Kleinschreibung)
haben. Um einen Vergleich ohne Unterscheidung der
Groß-/Kleinschreibung durchzuführen, konvertieren Sie den Wert
mit der Funktion CONVERT()
in einen
nichtbinären String. Wenn der Zeichensatz des Ergebnisses eine
Sortierung mit Unterscheidung der Groß-/Kleinschreibung hat, dann
unterscheidet die LIKE
-Operation die
Groß-/Kleinschreibung nicht:
SELECT 'A' LIKE CONVERT(blob_col
USING latin1) FROMtbl_name
;
Um einen anderen Zeichensatz zu verwenden, ersetzen Sie
latin1
in der obigen Anweisung durch dessen
Namen. Wenn Sie gewährleisten wollen, dass eine Sortierung ohne
Unterscheidung der Groß-/Kleinschreibung verwendet wird, geben
Sie auf den Aufruf von CONVERT()
folgend eine
COLLATE
-Klausel an.
CONVERT()
kann – allgemeiner gesagt – für
den Vergleich von Strings verwendet werden, die in
unterschiedlichen Zeichensätzen dargestellt werden.
Die Umwandlungsfunktionen sind nützlich, um eine Spalte eines
bestimmten Typs in einer CREATE ...
SELECT
-Anweisung zu erstellen:
CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);
Die Funktionen können auch praktisch sein, um
ENUM
-Spalten in lexikaler Reihenfolge zu
sortieren. Normalerweise erfolgt die Sortierung von
ENUM
-Spalten unter Verwendung der internen
numerischen Werte. Die Umwandlung der Werte in
CHAR
führt zu einer lexikalen Sortierung:
SELECTenum_col
FROMtbl_name
ORDER BY CAST(enum_col
AS CHAR);
CAST(
ist das Gleiche wie str
AS BINARY)BINARY
.
str
CAST(
behandelt den Ausdruck als String mit dem Standardzeichensatz.
expr
AS CHAR)
CAST()
ändert das Ergebnis auch, wenn Sie es
als Teil eines komplexeren Ausdrucks wie etwa
CONCAT('Date: ',CAST(NOW() AS DATE))
verwenden.
Sie sollten CAST()
nicht zur Extraktion von
Daten in verschiedenen Formaten benutzen, sondern stattdessen
String-Funktionen wie LEFT()
oder
EXTRACT()
verwenden. Siehe auch
Abschnitt 12.5, „Datums- und Zeitfunktionen“.
Um einen String in einem Zahlenkontext in einen numerischen Wert umzuwandeln, müssen Sie normalerweise nichts anderes tun, als den String-Wert wie eine Zahl zu verwenden:
mysql> SELECT 1+'1';
-> 2
Wenn Sie eine Zahl im String-Kontext verwenden, wird die Zahl
automatisch in einen BINARY
-String konvertiert.
mysql> SELECT CONCAT('hello you ',2);
-> 'hello you 2'
MySQL unterstützt Berechnungen mit vorzeichenbehafteten wie auch
vorzeichenlosen 64-Bit-Werten. Wenn Sie numerische Operationen
(wie +
) verwenden und einer der Operanden ein
vorzeichenloser Integer ist, dann ist auch das Ergebnis
vorzeichenlos. Sie können dieses Verhalten außer Kraft setzen,
indem Sie die Umwandlungsoperatoren SIGNED
und
UNSIGNED
zur Umwandlung des Operanden in einen
vorzeichenbehafteten bzw. vorzeichenlosen 64-Bit-Integer benutzen.
mysql>SELECT CAST(1-2 AS UNSIGNED)
-> 18446744073709551615 mysql>SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
-> -1
Beachten Sie, dass, wenn ein Operand ein Fließkommawert ist, das
Ergebnis ebenfalls ein Fließkommawert sein wird; die obige Regel
findet in diesem Fall keine Anwendung. (In diesem Kontext werden
DECIMAL
-Spalten als Fließkommawerte
betrachtet.)
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;
-> -1.0
Wenn Sie in einer Rechenoperation einen String verwenden, dann wird dieser in eine Fließkommazahl umgewandelt.
Konvertieren Sie einen „Nulldatums“-String in ein
Datum, dann geben CONVERT()
und
CAST()
NULL
zurück und
erzeugen bei aktiviertem SQL-Modus NO_ZERO_DATE
außerdem eine Warnung.
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.