В MariaDB, CAST()
е вградена функция, която преобразува стойност в друг тип данни. Приема стойност от един тип и връща стойност от посочения тип.
Вие предоставяте стойността като аргумент, когато извиквате функцията, както и типа, в който искате да се преобразува.
CAST()
работи подобно на CONVERT()
.
Синтаксис
Синтаксисът е така:
CAST(expr AS type)
Където expr
е стойността за преобразуване и type
е типът данни, към който искате да се преобразува.
Пример
Ето един прост пример:
SELECT CAST(123.45 AS INT);
Резултат:
+---------------------+| CAST(123.45 КАТО INT) |+---------------------+| 123 |+---------------------+
Това прехвърля стойността на цяло число и следователно десетичните знаци бяха премахнати.
Ето още един пример:
SELECT CAST('2020-01-01' AS DATETIME);
Резултат:
+--------------------------------+| CAST('2020-01-01' КАТО ДАТА ВРЕМЕ) |+--------------------------------+| 2020-01-01 00:00:00 |+--------------------------------+
В този случай преобразувахме низ в DATETIME
тип данни.
Неуспешно преобразуване
В предишния пример предоставихме валидна DATE
низ (или DATE
буквално). Следователно MariaDB успя да преобразува стойността в DATETIME
тип данни.
Ето какво се случва обаче, когато предоставим невалидна DATE
низ:
SELECT CAST('1 Jan, 2020' AS DATE);
Резултат:
+----------------------------+| CAST('1 януари 2020' КАТО ДАТА) |+----------------------------+| NULL |+-----------------------------+
Тук MariaDB очевидно не можа да разбере как да преобразува тази стойност и върна NULL
.
В този случай бихме могли да използваме друга функция, като STR_TO_DATE()
за да извършите такова преобразуване:
SELECT STR_TO_DATE('1 Jan, 2020', '%e %M, %Y');
Резултат:
+-----------------------------------+| STR_TO_DATE('1 януари 2020 г.', '%e %M, %Y') |+---------------------------- ------------+| 2020-01-01 |+-------------------------------------------------+предварително>Посочете набор от знаци
Възможно е да посочите набор от знаци, който да се използва за връщаната стойност, когато използвате
CAST()
функция.Пример:
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";
Резултат:
+--------+-----------------+------------------ -+----------------+| 123 | utf16 | latin1 | big5 |+--------+----------------+------------------- +----------------+| двоичен | utf16_general_ci | latin1_swedish_ci | big5_chinese_ci |+--------+-----------------+------------------- +----------------+Тук използвахме
COLLATION()
функция за връщане на съпоставянето на всяка стойност, след като е била прехвърлена към новия тип данни. Всяка стойност използва съпоставянето по подразбиране за посочения набор от знаци.Първоначалната стойност не е низ и така
COLLATION()
връща двоичен.Преобразува се в
CHAR
без уточняване на набора от знаци ще доведе доcollation_connection
се използва съпоставяне на набор от символи.Посочете колекция
Възможно е също да посочите съпоставяне.
Пример:
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";
Резултат:
+--------+--------------------+---------------- ---+-----------------------+| 123 | utf16 | latin1 | big5 |+--------+-------------------+---------------- --+-----------------------+| двоичен | utf16_icelandic_ci | latin1_german2_ci | big5_chinese_nopad_ci |+--------+-------------------+---------------- --+-----------------------+В този случай ние изрично посочихме съпоставяне, което да използваме, което не е съпоставянето по подразбиране за посочения набор от знаци (въпреки че все още е валидно съпоставяне за набора от знаци).
Посочването на съпоставяне, което не е валидно за набора от знаци, води до грешка.
Ето какво се случва, когато сменя първите две съпоставяния:
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";
Резултат:
ГРЕШКА 1253 (42000):COLLATION 'latin1_german2_ci' не е валидна за НАБОР ОТ СИМВОЛИ 'utf16'Стигна до първия и издаде грешка, защото
latin1_german2_ci
не е валидно съпоставяне заutf16
набор от символи.Вижте този списък със съпоставяния, налични в MariaDB, за пълен списък на съпоставянията и съответстващите им набори от знаци.
Нулеви аргументи
Опитвам се да преобразувам
null
връщаnull
:SELECT CAST(null AS DATETIME);
Резултат:
+-----------------------+| CAST(нула КАТО DATETIME) |+-----------------------+| NULL |+------------------------+Въпреки това, подаване на
null
без уточняване на новия тип данни води до грешка:SELECT CAST(null);
Резултат:
ГРЕШКА 1064 (42000):Имате грешка във вашия SQL синтаксис; проверете ръководството, което съответства на вашата версия на сървъра на MariaDB за правилния синтаксис, който да използвате близо до ')' на ред 1Липсващ аргумент
Извикване на
CAST()
без подаване на аргумент води до грешка:SELECT CAST();
Резултат:
ГРЕШКА 1064 (42000):Имате грешка във вашия SQL синтаксис; проверете ръководството, което съответства на вашата версия на сървъра на MariaDB за правилния синтаксис, който да използвате близо до ')' на ред 1