sql >> Database teknologi >  >> RDS >> MariaDB

Sådan fungerer CAST() i MariaDB

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

  1. Oracle SQL Analytisk forespørgsel - rekursiv regnearkslignende kørende total

  2. Hvordan kalder man Stored Procedure in a View?

  3. Håndtering af primære nøglekonflikter ved indsættelse af data i SQLite

  4. Tilføjelse af fremmednøgle til en skinnemodel