sql >> Database >  >> RDS >> MariaDB

Hoe CAST() werkt in MariaDB

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

  1. Hoe de max_allowed_packet size te veranderen

  2. Een database openen in de exclusieve modus in Access 2016

  3. Een datum in Brits formaat weergeven in SQL Server (T-SQL)

  4. Hoe verwijder ik alle niet-alfanumerieke tekens uit een string in MySQL?