sql >> Databasteknik >  >> RDS >> MariaDB

Hur CAST() fungerar i MariaDB

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

  1. Hur SQLite Count() fungerar

  2. MySQL TAN() Funktion – Returnerar tangenten för ett värde i MySQL

  3. Frågefel med tvetydigt kolumnnamn i SQL

  4. Partitionsfunktion COUNT() OVER möjlig med DISTINCT