I MariaDB, CAST()
er en indbygget funktion, der konverterer en værdi til en anden datatype. Det tager en værdi af én type og returnerer en værdi af den angivne type.
Du angiver værdien som et argument, når du kalder funktionen, såvel som den type, du gerne vil have den konverteret til.
CAST()
virker på samme måde som CONVERT()
.
Syntaks
Syntaksen ser sådan ud:
CAST(expr AS type)
Hvor expr
er den værdi, der skal konverteres, og type
er den datatype, du vil have den konverteret til.
Eksempel
Her er et simpelt eksempel:
SELECT CAST(123.45 AS INT);
Resultat:
+---------------------+ | CAST(123.45 AS INT) | +---------------------+ | 123 | +---------------------+
Dette kaster værdien til et heltal, og derfor blev decimalerne fjernet.
Her er et andet eksempel:
SELECT CAST('2020-01-01' AS DATETIME);
Resultat:
+--------------------------------+ | CAST('2020-01-01' AS DATETIME) | +--------------------------------+ | 2020-01-01 00:00:00 | +--------------------------------+
I dette tilfælde konverterede vi en streng til en DATETIME
datatype.
Konverteringsfejl
I det foregående eksempel angav vi en gyldig DATE
streng (eller DATE
bogstavelig). Derfor var MariaDB i stand til at konvertere værdien til en DATETIME
datatype.
Men her er, hvad der sker, når vi angiver en ugyldig DATE
streng:
SELECT CAST('1 Jan, 2020' AS DATE);
Resultat:
+-----------------------------+ | CAST('1 Jan, 2020' AS DATE) | +-----------------------------+ | NULL | +-----------------------------+
Her kunne MariaDB tilsyneladende ikke finde ud af at konvertere denne værdi og returnerede NULL
.
I dette tilfælde kunne vi bruge en anden funktion, såsom STR_TO_DATE()
for at udføre 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 | +-----------------------------------------+
Angiv et tegnsæt
Det er muligt at angive et tegnsæt til brug for returværdien, når du bruger CAST()
fungere.
Eksempel:
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 | +--------+------------------+-------------------+-----------------+
Her brugte vi COLLATION()
funktion for at returnere sammenstillingen af hver værdi, efter at den er blevet castet til den nye datatype. Hver værdi bruger standardsorteringen for det angivne tegnsæt.
Startværdien er ikke en streng, og derfor COLLATION()
returnerer binær.
Konverterer til CHAR
uden at angive tegnsættet vil det resultere i collation_connection
tegnsætsortering bliver brugt.
Angiv en sortering
Det er også muligt at angive en sortering.
Eksempel:
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 dette tilfælde specificerede vi eksplicit en sortering, der skal bruges, som ikke er standardsorteringen for det angivne tegnsæt (selv om det stadig er en gyldig sortering for tegnsættet).
Angivelse af en sortering, der ikke er gyldig for tegnsættet, resulterer i en fejl.
Her er, hvad der sker, når jeg skifter mellem de to første sorteringer:
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'
Det kom til den første og gav en fejl, fordi latin1_german2_ci
er ikke en gyldig sammenstilling for utf16
tegnsæt.
Se denne liste over sorteringer, der er tilgængelige i MariaDB for en komplet liste over sorteringer og deres matchende tegnsæt.
Nul-argumenter
Forsøger at konvertere null
returnerer null
:
SELECT CAST(null AS DATETIME);
Resultat:
+------------------------+ | CAST(null AS DATETIME) | +------------------------+ | NULL | +------------------------+
Men sender null
uden at angive den nye datatype resulterer det i en fejl:
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
Manglende argument
Kalder CAST()
uden at sende et argument resulterer i en fejl:
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