In MariaDB, CAST()
is een ingebouwde functie die een waarde converteert naar een ander gegevenstype. Het neemt een waarde van één type en retourneert een waarde van het opgegeven type.
U geeft de waarde op als argument wanneer u de functie aanroept, evenals het type waarnaar u deze wilt converteren.
CAST()
werkt vergelijkbaar met CONVERT()
.
Syntaxis
De syntaxis gaat als volgt:
CAST(expr AS type)
Waar expr
is de waarde die moet worden omgerekend, en type
is het gegevenstype waarnaar u het wilt converteren.
Voorbeeld
Hier is een eenvoudig voorbeeld:
SELECT CAST(123.45 AS INT);
Resultaat:
+---------------------+ | CAST(123.45 AS INT) | +---------------------+ | 123 | +---------------------+
Dit wierp de waarde op een geheel getal en daarom werden de decimalen verwijderd.
Hier is nog een voorbeeld:
SELECT CAST('2020-01-01' AS DATETIME);
Resultaat:
+--------------------------------+ | CAST('2020-01-01' AS DATETIME) | +--------------------------------+ | 2020-01-01 00:00:00 | +--------------------------------+
In dit geval hebben we een string geconverteerd naar een DATETIME
gegevenstype.
Conversie mislukt
In het vorige voorbeeld hebben we een geldige DATE
. opgegeven tekenreeks (of DATE
letterlijk). Daarom kon MariaDB de waarde converteren naar een DATETIME
gegevenstype.
Dit is echter wat er gebeurt als we een ongeldige DATE
opgeven tekenreeks:
SELECT CAST('1 Jan, 2020' AS DATE);
Resultaat:
+-----------------------------+ | CAST('1 Jan, 2020' AS DATE) | +-----------------------------+ | NULL | +-----------------------------+
Hier kon MariaDB blijkbaar niet achterhalen hoe deze waarde moest worden geconverteerd en retourneerde NULL
.
In dit geval zouden we een andere functie kunnen gebruiken, zoals STR_TO_DATE()
om een dergelijke conversie uit te voeren:
SELECT STR_TO_DATE('1 Jan, 2020', '%e %M, %Y');
Resultaat:
+-----------------------------------------+ | STR_TO_DATE('1 Jan, 2020', '%e %M, %Y') | +-----------------------------------------+ | 2020-01-01 | +-----------------------------------------+
Geef een tekenset op
Het is mogelijk om een tekenset op te geven die moet worden gebruikt voor de retourwaarde bij gebruik van de CAST()
functie.
Voorbeeld:
SELECT
COLLATION(123) AS "123",
COLLATION(CAST(123 AS CHAR CHARACTER SET utf16)) AS "utf16",
COLLATION(CAST(123 AS CHAR CHARACTER SET latin1)) AS "latin1",
COLLATION(CAST(123 AS CHAR CHARACTER SET big5)) AS "big5";
Resultaat:
+--------+------------------+-------------------+-----------------+ | 123 | utf16 | latin1 | big5 | +--------+------------------+-------------------+-----------------+ | binary | utf16_general_ci | latin1_swedish_ci | big5_chinese_ci | +--------+------------------+-------------------+-----------------+
Hier gebruikten we de COLLATION()
functie om de sortering van elke waarde te retourneren nadat deze naar het nieuwe gegevenstype is gegoten. Elke waarde gebruikt de standaardsortering voor de opgegeven tekenset.
De beginwaarde is geen tekenreeks, dus COLLATION()
geeft binair terug.
Converteren naar CHAR
zonder de tekenset op te geven, resulteert dit in de collation_connection
tekensetsortering wordt gebruikt.
Geef een sortering op
Het is ook mogelijk om een sortering op te geven.
Voorbeeld:
SELECT
COLLATION(123) AS "123",
COLLATION(CAST(123 AS CHAR CHARACTER SET utf16) COLLATE utf16_icelandic_ci) AS "utf16",
COLLATION(CAST(123 AS CHAR CHARACTER SET latin1) COLLATE latin1_german2_ci) AS "latin1",
COLLATION(CAST(123 AS CHAR CHARACTER SET big5) COLLATE big5_chinese_nopad_ci) AS "big5";
Resultaat:
+--------+--------------------+-------------------+-----------------------+ | 123 | utf16 | latin1 | big5 | +--------+--------------------+-------------------+-----------------------+ | binary | utf16_icelandic_ci | latin1_german2_ci | big5_chinese_nopad_ci | +--------+--------------------+-------------------+-----------------------+
In dit geval hebben we expliciet een sortering gespecificeerd om te gebruiken die niet de standaard sortering is voor de opgegeven tekenset (hoewel nog steeds een geldige sortering voor de tekenset).
Het specificeren van een sortering die niet geldig is voor de tekenset resulteert in een fout.
Dit gebeurt er als ik de eerste twee sorteringen omwissel:
SELECT
COLLATION(123) AS "123",
COLLATION(CAST(123 AS CHAR CHARACTER SET utf16) COLLATE latin1_german2_ci) AS "utf16",
COLLATION(CAST(123 AS CHAR CHARACTER SET latin1) COLLATE utf16_icelandic_ci) AS "latin1",
COLLATION(CAST(123 AS CHAR CHARACTER SET big5) COLLATE big5_chinese_nopad_ci) AS "big5";
Resultaat:
ERROR 1253 (42000): COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET 'utf16'
Het kwam bij de eerste en gaf een fout, omdat latin1_german2_ci
is geen geldige sortering voor de utf16
tekenset.
Bekijk deze lijst met beschikbare sorteringen in MariaDB voor een volledige lijst van sorteringen en hun overeenkomende tekensets.
Nullargumenten
Probeert null
te converteren retourneert null
:
SELECT CAST(null AS DATETIME);
Resultaat:
+------------------------+ | CAST(null AS DATETIME) | +------------------------+ | NULL | +------------------------+
Echter, null
. doorgeven zonder het nieuwe gegevenstype op te geven resulteert in een fout:
SELECT CAST(null);
Resultaat:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1
Ontbrekend argument
Bellen CAST()
zonder een argument door te geven resulteert in een fout:
SELECT CAST();
Resultaat:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1