I MariaDB, CAST()
är en inbyggd funktion som konverterar ett värde till en annan datatyp. Det tar ett värde av en typ och returnerar ett värde av den angivna typen.
Du anger värdet som ett argument när du anropar funktionen, samt den typ som du vill att den ska konverteras till.
CAST()
fungerar liknande CONVERT()
.
Syntax
Syntaxen ser ut så här:
CAST(expr AS type)
Där expr
är värdet som ska konverteras och type
är den datatyp som du vill att den ska konverteras till.
Exempel
Här är ett enkelt exempel:
SELECT CAST(123.45 AS INT);
Resultat:
+---------------------+ | CAST(123.45 AS INT) | +---------------------+ | 123 | +---------------------+
Detta kastade värdet till ett heltal, och därför togs decimalerna bort.
Här är ett annat exempel:
SELECT CAST('2020-01-01' AS DATETIME);
Resultat:
+--------------------------------+ | CAST('2020-01-01' AS DATETIME) | +--------------------------------+ | 2020-01-01 00:00:00 | +--------------------------------+
I det här fallet konverterade vi en sträng till en DATETIME
datatyp.
Konverteringsfel
I föregående exempel angav vi ett giltigt DATE
sträng (eller DATE
bokstavlig). Därför kunde MariaDB konvertera värdet till en DATETIME
datatyp.
Men det här är vad som händer när vi tillhandahåller ett ogiltigt DATE
sträng:
SELECT CAST('1 Jan, 2020' AS DATE);
Resultat:
+-----------------------------+ | CAST('1 Jan, 2020' AS DATE) | +-----------------------------+ | NULL | +-----------------------------+
Här kunde MariaDB tydligen inte ta reda på hur man konverterade detta värde och returnerade NULL
.
I det här fallet kan vi använda en annan funktion, till exempel STR_TO_DATE()
för att utföra en sådan konvertering:
SELECT STR_TO_DATE('1 Jan, 2020', '%e %M, %Y');
Resultat:
+-----------------------------------------+ | STR_TO_DATE('1 Jan, 2020', '%e %M, %Y') | +-----------------------------------------+ | 2020-01-01 | +-----------------------------------------+
Ange en teckenuppsättning
Det är möjligt att ange en teckenuppsättning som ska användas för returvärdet när du använder CAST()
fungera.
Exempel:
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";
Resultat:
+--------+------------------+-------------------+-----------------+ | 123 | utf16 | latin1 | big5 | +--------+------------------+-------------------+-----------------+ | binary | utf16_general_ci | latin1_swedish_ci | big5_chinese_ci | +--------+------------------+-------------------+-----------------+
Här använde vi COLLATION()
funktion för att returnera sammanställningen av varje värde efter att det har castats till den nya datatypen. Varje värde använder standardsorteringen för den angivna teckenuppsättningen.
Det initiala värdet är inte en sträng, och så COLLATION()
returnerar binärt.
Konverterar till CHAR
utan att ange teckenuppsättningen kommer att resultera i collation_connection
teckenuppsättningssortering används.
Ange en sortering
Det är också möjligt att ange en sortering.
Exempel:
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";
Resultat:
+--------+--------------------+-------------------+-----------------------+ | 123 | utf16 | latin1 | big5 | +--------+--------------------+-------------------+-----------------------+ | binary | utf16_icelandic_ci | latin1_german2_ci | big5_chinese_nopad_ci | +--------+--------------------+-------------------+-----------------------+
I det här fallet angav vi uttryckligen en sortering att använda som inte är standardsorteringen för den angivna teckenuppsättningen (även om den fortfarande är en giltig sortering för teckenuppsättningen).
Att ange en sortering som inte är giltig för teckenuppsättningen resulterar i ett fel.
Så här händer när jag växlar mellan de två första sorteringarna:
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";
Resultat:
ERROR 1253 (42000): COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET 'utf16'
Den kom till den första och gav ett fel, eftersom latin1_german2_ci
är inte en giltig sammanställning för utf16
teckenuppsättning.
Se den här listan över sorteringar som är tillgängliga i MariaDB för en fullständig lista över sammanställningar och deras matchande teckenuppsättningar.
Nollargument
Försöker konvertera null
returnerar null
:
SELECT CAST(null AS DATETIME);
Resultat:
+------------------------+ | CAST(null AS DATETIME) | +------------------------+ | NULL | +------------------------+
Men skickar null
utan att ange den nya datatypen resulterar det i ett fel:
SELECT CAST(null);
Resultat:
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
Argument saknas
Anropar CAST()
utan att skicka ett argument resulterar det i ett fel:
SELECT CAST();
Resultat:
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