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

Come funziona CAST() in MariaDB

In MariaDB, CAST() è una funzione incorporata che converte un valore in un altro tipo di dati. Prende un valore di un tipo e restituisce un valore del tipo specificato.

Fornisci il valore come argomento quando chiami la funzione, nonché il tipo in cui desideri che venga convertita.

CAST() funziona in modo simile a CONVERT() .

Sintassi

La sintassi è questa:

CAST(expr AS type)

Dove expr è il valore da convertire e type è il tipo di dati in cui vuoi che venga convertito.

Esempio

Ecco un semplice esempio:

SELECT CAST(123.45 AS INT);

Risultato:

+---------------------+
| CAST(123.45 AS INT) |
+---------------------+
|                 123 |
+---------------------+

In questo modo il valore viene convertito in un numero intero e, pertanto, le posizioni decimali sono state rimosse.

Ecco un altro esempio:

SELECT CAST('2020-01-01' AS DATETIME);

Risultato:

+--------------------------------+
| CAST('2020-01-01' AS DATETIME) |
+--------------------------------+
| 2020-01-01 00:00:00            |
+--------------------------------+

In questo caso, abbiamo convertito una stringa in un DATETIME tipo di dati.

Conversione fallita

Nell'esempio precedente, abbiamo fornito un DATE valido stringa (o DATE letterale). Pertanto MariaDB è stata in grado di convertire il valore in un DATETIME tipo di dati.

Tuttavia, ecco cosa succede quando forniamo un DATE non valido stringa:

SELECT CAST('1 Jan, 2020' AS DATE);

Risultato:

+-----------------------------+
| CAST('1 Jan, 2020' AS DATE) |
+-----------------------------+
| NULL                        |
+-----------------------------+

Qui, apparentemente MariaDB non è riuscita a capire come convertire questo valore e ha restituito NULL .

In questo caso, potremmo usare un'altra funzione, come STR_TO_DATE() per eseguire tale conversione:

SELECT STR_TO_DATE('1 Jan, 2020', '%e %M, %Y');

Risultato:

+-----------------------------------------+
| STR_TO_DATE('1 Jan, 2020', '%e %M, %Y') |
+-----------------------------------------+
| 2020-01-01                              |
+-----------------------------------------+

Specifica un set di caratteri

È possibile specificare un set di caratteri da utilizzare per il valore restituito quando si utilizza CAST() funzione.

Esempio:

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";

Risultato:

+--------+------------------+-------------------+-----------------+
| 123    | utf16            | latin1            | big5            |
+--------+------------------+-------------------+-----------------+
| binary | utf16_general_ci | latin1_swedish_ci | big5_chinese_ci |
+--------+------------------+-------------------+-----------------+

Qui, abbiamo usato il COLLATION() funzione per restituire le regole di confronto di ogni valore dopo che è stato eseguito il cast del nuovo tipo di dati. Ciascun valore utilizza le regole di confronto predefinite per il set di caratteri specificato.

Il valore iniziale non è una stringa, quindi COLLATION() restituisce binario.

Conversione in CHAR senza specificare il set di caratteri risulterà nel collation_connection confronto del set di caratteri in uso.

Specifica una confronto

È anche possibile specificare un confronto.

Esempio:

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";

Risultato:

+--------+--------------------+-------------------+-----------------------+
| 123    | utf16              | latin1            | big5                  |
+--------+--------------------+-------------------+-----------------------+
| binary | utf16_icelandic_ci | latin1_german2_ci | big5_chinese_nopad_ci |
+--------+--------------------+-------------------+-----------------------+

In questo caso, abbiamo specificato esplicitamente un confronto da utilizzare che non è il confronto predefinito per il set di caratteri specificato (sebbene sia ancora un confronto valido per il set di caratteri).

Se si specifica una fascicolazione non valida per il set di caratteri, viene generato un errore.

Ecco cosa succede quando cambio le prime due regole di confronto:

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";

Risultato:

ERROR 1253 (42000): COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET 'utf16'

È arrivato al primo e ha generato un errore, perché latin1_german2_ci non è un confronto valido per utf16 set di caratteri.

Consulta questo elenco di regole di confronto disponibili in MariaDB per un elenco completo delle regole di confronto e dei loro set di caratteri corrispondenti.

Argomenti nulli

Tentativo di convertire null restituisce null :

SELECT CAST(null AS DATETIME);

Risultato:

+------------------------+
| CAST(null AS DATETIME) |
+------------------------+
| NULL                   |
+------------------------+

Tuttavia, passando null senza specificare il nuovo tipo di dati viene generato un errore:

SELECT CAST(null);

Risultato:

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

Argomento mancante

Chiamando CAST() senza passare un argomento si ottiene un errore:

SELECT CAST();

Risultato:

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