14.10 Функции и операторы приведения типов
Таблица 14.15 Функции и операторы приведения типов
Функции и операторы приведения типов позволяют преобразовывать значения из одного типа данных в другой.
Описание функций и операторов приведения типов
-
BINARYexprОператор
BINARYпреобразует выражение в бинарную строку (строку с набором символовbinaryи сортировкойbinary). ОператорBINARYчасто используется для принудительного выполнения сравнения строковых значений байт за байтом по числовым значениям байтов, а не символом за символом. ОператорBINARYтакже делает значимыми в сравнении пробелы в конце строк. Подробнее о различиях между сортировкойbinaryнабора символовbinaryи сортировками_binдля наборов символов, отличных от бинарных, см. раздел 12.8.5, «Сравнение бинарной сортировки с сортировкой _bin».Оператор
BINARYустарел; ожидается его удаление в будущих версиях MySQL. ИспользуйтеCAST(... AS BINARY)вместо него.mysql>
SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;-> OK mysql>SELECT 'a' = 'A';-> 1 mysql>SELECT BINARY 'a' = 'A';-> 0 mysql>SELECT 'a' = 'a ';-> 1 mysql>SELECT BINARY 'a' = 'a ';-> 0При сравнении
BINARYвлияет на всё выражение; его можно поместить перед любым операндом с одинаковым результатом.Для преобразования строкового выражения в бинарную строку эти конструкции эквивалентны:
CONVERT(
exprUSING BINARY) CAST(exprAS BINARY) BINARYexprЕсли значение является строковой константой, его можно обозначить как бинарную строку без преобразования, используя ввод набора символов
_binary:mysql>
SELECT 'a' = 'A';-> 1 mysql>SELECT _binary 'a' = 'A';-> 0Подробнее о вводах см. раздел 12.3.8, «Вводы наборов символов».
Оператор
BINARYв выражениях отличается по действию от атрибутаBINARYв определениях столбцов символьного типа. Для столбца символьного типа, определённого с атрибутомBINARY, MySQL назначает табличный набор символов по умолчанию и бинарную (_bin) сортировку этого набора символов. Каждый набор символов, отличный от бинарного, имеет сортировку_bin. Например, если табличный набор символов по умолчанию —utf8mb4, эти два определения столбцов эквивалентны:CHAR(10) BINARY CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Использование
CHARACTER SET binaryпри определении столбцаCHAR,VARCHARилиTEXTзаставляет столбец рассматриваться как соответствующий бинарный тип данных строки. Например, следующие пары определений эквивалентны:CHAR(10) CHARACTER SET binary BINARY(10) VARCHAR(10) CHARACTER SET binary VARBINARY(10) TEXT CHARACTER SET binary BLOB
Если
BINARYвызывается из клиента mysql, бинарные строки отображаются в шестнадцатеричном формате, в зависимости от значения параметра--binary-as-hex. Дополнительную информацию об этом параметре см. в разделе 6.5.1, «mysql — Клиентская командная строка MySQL».
-
CAST(timestamp_valueAT TIME ZONEtimezone_specifierAS DATETIME[(precision)])timezone_specifier: [INTERVAL] '+00:00' | 'UTC'С синтаксисом
CAST(, функцияexprAStypeCAST()принимает выражение любого типа и возвращает значение указанного типа. Данную операцию также можно записать какCONVERT(, что эквивалентно. Еслиexpr,type)exprравноNULL, тоCAST()возвращаетNULL.Разрешены следующие
typeзначения:-
BINARY[(N)]Возвращает строку с типом данных
VARBINARY, за исключением случая, когда выражениеexprпусто (длиной ноль). В этом случае возвращаемый тип —BINARY(0). Если указана необязательная длинаN, тоBINARY(заставляет преобразование использовать не болееN)Nбайтов аргумента. Значения, корочеNбайт, дополняются0x00байтами до длиныN. Если необязательная длинаNне указана, MySQL вычисляет максимальную длину из выражения. Если заданная или вычисленная длина больше внутреннего порога, возвращаемый тип —BLOB. Если длина всё ещё слишком велика, возвращаемый тип —LONGBLOB.Описание того, как преобразование в
BINARYвлияет на сравнения, см. в разделе 13.3.3, «Типы BINARY и VARBINARY». -
CHAR[(N)] [charset_info]Возвращает строку с типом данных
VARCHAR, за исключением случая, когда выражениеexprпусто (длиной ноль). В этом случае возвращаемый тип —CHAR(0). Если указана необязательная длинаN, тоCHAR(заставляет преобразование использовать не болееN)Nсимволов аргумента. Значения, корочеNсимволов, не дополняются. Если необязательная длинаNне указана, MySQL вычисляет максимальную длину из выражения. Если заданная или вычисленная длина больше внутреннего порога, возвращаемый тип —TEXT. Если длина всё ещё слишком велика, возвращаемый тип —LONGTEXT.Без указания
charset_info,CHARвозвращает строку с набором символов по умолчанию. Для явного указания набора символов разрешены следующиеcharset_infoзначения:CHARACTER SET: Возвращает строку с указанным набором символов.charset_nameASCII: Краткая форма дляCHARACTER SET latin1.UNICODE: Краткая форма дляCHARACTER SET ucs2.
Во всех случаях строка имеет набор символов по умолчанию с сортировкой по умолчанию.
-
DATEВозвращает значение типа
DATE. -
DATETIME[(M)]Возвращает значение типа
DATETIME. Если задано необязательное значениеM, оно определяет точность дробных секунд. -
DECIMAL[(M[,D])]Возвращает значение типа
DECIMAL. Если заданы необязательные значенияMиD, они определяют максимальное количество цифр (точность) и количество цифр после десятичной точки (разряд). ЕслиDопущено, предполагается 0. ЕслиMопущено, предполагается 10. -
DOUBLEВозвращает значение типа
DOUBLE. -
FLOAT[(p)]Если точность
pне указана, возвращает результат типаFLOAT. Еслиpуказано и 0 <= <p<= 24, результат имеет типFLOAT. Если 25 <=p<= 53, результат имеет типDOUBLE. Еслиp< 0 илиp> 53, возвращается ошибка. -
JSONВозвращает значение типа
JSON. Подробности о правилах преобразования значений междуJSONи другими типами см. в сравнении и упорядочивании значений JSON. -
NCHAR[(N)]Подобно
CHAR, но возвращает строку с национальным набором символов. См. раздел 12.3.7, «Национальный набор символов».В отличие от
CHAR,NCHARне позволяет указывать информацию о наборе символов в конце. -
REALВозвращает результат типа
REAL. На самом деле, этоFLOAT, если включен режим SQLREAL_AS_FLOAT; в противном случае результат имеет типDOUBLE. -
SIGNED [INTEGER]Возвращает целое со знаком
BIGINT. -
spatial_typeCAST()иCONVERT()поддерживают преобразование значений геометрии из одного пространственного типа в другой для определённых комбинаций пространственных типов. Подробнее см. Преобразование пространственных типов. -
TIME[(M)]Возвращает значение типа
TIME. Если задано необязательное значениеM, оно определяет точность дробных секунд. -
UNSIGNED [INTEGER]Возвращает целое без знака
BIGINT.
-
-
YEARВозвращает значение типа
YEAR. Эти правила определяют преобразование вYEARследующим образом:Для четырёхзначного числа в диапазоне 1901-2155 включительно, или для строки, которая может быть интерпретирована как четырёхзначное число в этом диапазоне, возвращает соответствующее значение
YEAR.-
Для числа из одного или двух цифр, или для строки, которая может быть интерпретирована как такое число, возвращает значение
YEARследующим образом:Если число находится в диапазоне от 1 до 69 включительно, добавляет 2000 и возвращает сумму.
Если число находится в диапазоне от 70 до 99 включительно, добавляет 1900 и возвращает сумму.
Для строки, которая оценивается как 0, возвращает 2000.
Для числа 0, возвращает 0.
-
Для значения типа
DATE,DATETIMEилиTIMESTAMP, возвращает частьYEARзначения. Для значения типаTIMEвозвращает текущий год.Если вы не указываете тип аргумента
TIME, вы можете получить другой результат, чем ожидается, как показано здесь:mysql>
SELECT CAST("11:35:00" AS YEAR), CAST(TIME "11:35:00" AS YEAR);+--------------------------+-------------------------------+ | CAST("11:35:00" AS YEAR) | CAST(TIME "11:35:00" AS YEAR) | +--------------------------+-------------------------------+ | 2011 | 2021 | +--------------------------+-------------------------------+ -
Если аргумент имеет тип
DECIMAL,DOUBLE,DECIMALилиREAL, округляет значение до ближайшего целого, затем пытается преобразовать значение вYEAR, используя правила для целых значений, как показано здесь:mysql>
SELECT CAST(1944.35 AS YEAR), CAST(1944.50 AS YEAR);+-----------------------+-----------------------+ | CAST(1944.35 AS YEAR) | CAST(1944.50 AS YEAR) | +-----------------------+-----------------------+ | 1944 | 1945 | +-----------------------+-----------------------+ mysql>SELECT CAST(66.35 AS YEAR), CAST(66.50 AS YEAR);+---------------------+---------------------+ | CAST(66.35 AS YEAR) | CAST(66.50 AS YEAR) | +---------------------+---------------------+ | 2066 | 2067 | +---------------------+---------------------+ Для значений, которые не могут быть успешно преобразованы в
YEAR, возвращаетNULL.
Строковое значение, содержащее нечисловые символы, которые необходимо обрезать перед преобразованием, вызывает предупреждение, как показано здесь:
mysql>
SELECT CAST("1979aaa" AS YEAR);+-------------------------+ | CAST("1979aaa" AS YEAR) | +-------------------------+ | 1979 | +-------------------------+ 1 row in set, 1 warning (0.00 sec) mysql>SHOW WARNINGS;+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect YEAR value: '1979aaa' | +---------+------+-------------------------------------------+
InnoDBпозволяет использовать дополнительное ключевое словоARRAYдля создания индекса с множественными значениями по массивуJSONв рамкахCREATE INDEX,CREATE TABLEиALTER TABLEоператоров.ARRAYне поддерживается, за исключением использования для создания индекса с множественными значениями в одном из этих операторов, в этом случае он требуется. Столбец, подлежащий индексированию, должен быть столбцом типаJSON. СARRAY,typeпосле ключевого словаASможет указывать любой из типов, поддерживаемыхCAST(), за исключениемBINARY,JSONиYEAR. Для получения информации о синтаксисе и примерах, а также других важных данных, см. Мультивалютные индексы.ПримечаниеCONVERT(), в отличие отCAST(), не поддерживает создание индексов с множественными значениями или ключевое словоARRAY.CAST()поддерживает получение значения типаTIMESTAMPкак в UTC, используя операторAT TIMEZONE. Поддерживается только часовой пояс UTC; это может быть указано как'+00:00'или'UTC'. Единственный поддерживаемый тип возвращаемого значения —DATETIMEс необязательным спецификатором точности в диапазоне от 0 до 6 включительно.Также поддерживаются значения
TIMESTAMP, использующие смещения часовых поясов.mysql>
SELECT @@system_time_zone;+--------------------+ | @@system_time_zone | +--------------------+ | EDT | +--------------------+ 1 row in set (0.00 sec) mysql>CREATE TABLE tz (c TIMESTAMP);Query OK, 0 rows affected (0.41 sec) mysql>INSERT INTO tz VALUES->ROW(CURRENT_TIMESTAMP),->ROW('2020-07-28 14:50:15+1:00');Query OK, 1 row affected (0.08 sec) mysql>TABLE tz;+---------------------+ | c | +---------------------+ | 2020-07-28 09:22:41 | | 2020-07-28 09:50:15 | +---------------------+ 2 rows in set (0.00 sec) mysql>SELECT CAST(c AT TIME ZONE '+00:00' AS DATETIME) AS u FROM tz;+---------------------+ | u | +---------------------+ | 2020-07-28 13:22:41 | | 2020-07-28 13:50:15 | +---------------------+ 2 rows in set (0.00 sec) mysql>SELECT CAST(c AT TIME ZONE 'UTC' AS DATETIME(2)) AS u FROM tz;+------------------------+ | u | +------------------------+ | 2020-07-28 13:22:41.00 | | 2020-07-28 13:50:15.00 | +------------------------+ 2 rows in set (0.00 sec)Если вы используете
'UTC'в качестве спецификатора часового пояса с этой формойCAST(), а сервер выдает ошибку, например Неизвестный или неправильный часовой пояс: 'UTC', вам может потребоваться установить таблицы часовых поясов MySQL (см. Заполнение таблиц часовых поясов).AT TIME ZONEне поддерживает ключевое словоARRAYи не поддерживается функциейCONVERT().-
-
CONVERT(exprUSINGtranscoding_name)CONVERT(— это стандартный синтаксис SQL. Не-exprUSINGtranscoding_name)USINGформаCONVERT()— это синтаксис ODBC. Независимо от используемого синтаксиса, функция возвращаетNULL, еслиexprравноNULL.CONVERT(преобразует данные между различными наборами символов. В MySQL имена транскодирования совпадают с соответствующими именами наборов символов. Например, этот оператор преобразует строкуexprUSINGtranscoding_name)'abc'в наборе символов по умолчанию в соответствующую строку в наборе символовutf8mb4:SELECT CONVERT('abc' USING utf8mb4);CONVERT(синтаксис (безexpr,type)USING) принимает выражение и значениеtype, определяющее тип результата, и генерирует результат указанного типа. Эта операция также может быть выражена какCAST(, что эквивалентно. Для получения дополнительной информации см. описаниеexprAStype)CAST().
Преобразования наборов символов
CONVERT() с клаузой USING преобразует данные между наборами символов:
CONVERT(expr USING transcoding_name)
В MySQL имена транскодирования совпадают с соответствующими именами наборов символов.
Примеры:
SELECT CONVERT('test' USING utf8mb4);
SELECT CONVERT(_latin1'Müller' USING utf8mb4);
INSERT INTO utf8mb4_table (utf8mb4_column)
SELECT CONVERT(latin1_column USING utf8mb4) FROM latin1_table;
Для преобразования строк между наборами символов также можно использовать синтаксис CONVERT( (без expr,
type)USING) или CAST(, что эквивалентно: expr AS
type)
CONVERT(string, CHAR[(N)] CHARACTER SET charset_name)
CAST(string AS CHAR[(N)] CHARACTER SET charset_name)
Примеры:
SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4);
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4);
Если вы укажете CHARACTER SET
, как показано выше, набор символов и сортировка результата будут charset_namecharset_name и сортировка по умолчанию для charset_name. Если вы опустите CHARACTER SET
, набор символов и сортировка результата определяются системными переменными charset_namecharacter_set_connection и collation_connection, которые определяют набор символов и сортировку подключения по умолчанию (см. Раздел 12.4, «Наборы символов и сортировки подключения»).
Клауза COLLATE не допускается в вызове CONVERT() или CAST(), но вы можете применить её к результату функции. Например, эти варианты допустимы:
SELECT CONVERT('test' USING utf8mb4) COLLATE utf8mb4_bin;
SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin;
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin;
Но эти варианты недопустимы:
SELECT CONVERT('test' USING utf8mb4 COLLATE utf8mb4_bin);
SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);
Для строковых литералов другой способ указания набора символов — использование вводного символа набора символов. _latin1 и _latin2 в предыдущем примере являются примерами вводных символов. В отличие от функций преобразования, таких как CAST() или CONVERT(), которые преобразуют строку из одного набора символов в другой, вводной символ указывает на то, что строковый литерал имеет определённый набор символов, без преобразования. Для получения дополнительной информации см. Раздел 12.3.8, «Вводные символы набора символов».
Преобразования наборов символов для сравнения строк
Обычно вы не можете сравнивать значение BLOB или другую двоичную строку с учётом регистра, поскольку двоичные строки используют набор символов binary, который не имеет сортировки с понятием регистра. Для выполнения сравнения без учёта регистра сначала используйте функцию CONVERT() или CAST() для преобразования значения в строку, не являющуюся двоичной. Сравнения полученной строки используют её сортировку. Например, если сортировка результата преобразования не учитывает регистр, операция LIKE также не учитывает регистр. Это верно для следующей операции, так как по умолчанию сортировка utf8mb4 (utf8mb4_0900_ai_ci) не учитывает регистр:
SELECT 'A' LIKE CONVERT(blob_col USING utf8mb4)
FROM tbl_name;
Для указания конкретной сортировки для преобразованной строки используйте предложение COLLATE после вызова функции CONVERT():
SELECT 'A' LIKE CONVERT(blob_col USING utf8mb4) COLLATE utf8mb4_unicode_ci
FROM tbl_name;
Для использования другого набора символов замените его имя на utf8mb4 в предыдущих операциях (аналогично для использования другой сортировки).
CONVERT() и CAST() можно использовать более широко для сравнения строк, представленных в различных наборах символов. Например, сравнение этих строк приводит к ошибке, поскольку у них разные наборы символов:
mysql> SET @s1 = _latin1 'abc', @s2 = _latin2 'abc';
mysql> SELECT @s1 = @s2;
ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
and (latin2_general_ci,IMPLICIT) for operation '='
Преобразование одной из строк в набор символов, совместимый с другим, позволяет выполнить сравнение без ошибки:
mysql> SELECT @s1 = CONVERT(@s2 USING latin1);
+---------------------------------+
| @s1 = CONVERT(@s2 USING latin1) |
+---------------------------------+
| 1 |
+---------------------------------+
Преобразование набора символов также полезно перед преобразованием регистра двоичных строк. LOWER() и UPPER() неэффективны, если применять их непосредственно к двоичным строкам, потому что понятие регистра к ним не относится. Чтобы выполнить преобразование регистра двоичной строки, сначала преобразуйте её в строку, не являющуюся двоичной, используя набор символов, соответствующий данным, хранящимся в строке:
mysql> SET @str = BINARY 'New York';
mysql> SELECT LOWER(@str), LOWER(CONVERT(@str USING utf8mb4));
+-------------+------------------------------------+
| LOWER(@str) | LOWER(CONVERT(@str USING utf8mb4)) |
+-------------+------------------------------------+
| New York | new york |
+-------------+------------------------------------+
Обратите внимание, что если вы применяете BINARY, CAST() или CONVERT() к индексированному столбцу, MySQL может неэффективно использовать индекс.
Операции приведения типов пространственных объектов
CAST() и CONVERT() поддерживают приведение значений геометрии из одного пространственного типа в другой для определённых комбинаций пространственных типов. Следующий список показывает разрешённые комбинации типов, где «“Расширение MySQL”» обозначает приведения, реализованные в MySQL, помимо тех, которые определены в стандарте SQL/MM:
-
Из
Pointв:MultiPointGeometryCollection
-
Из
LineStringв:Polygon(расширение MySQL)MultiPoint(расширение MySQL)MultiLineStringGeometryCollection
-
Из
Polygonв:LineString(расширение MySQL)MultiLineString(расширение MySQL)MultiPolygonGeometryCollection
-
Из
MultiPointв:PointLineString(расширение MySQL)GeometryCollection
-
Из
MultiLineStringв:LineStringPolygon(расширение MySQL)MultiPolygon(расширение MySQL)GeometryCollection
-
Из
MultiPolygonв:PolygonMultiLineString(расширение MySQL)GeometryCollection
-
Из
GeometryCollectionв:PointLineStringPolygonMultiPointMultiLineStringMultiPolygon
При приведении пространственных типов, GeometryCollection и GeomCollection являются синонимами для одного и того же типа результата.
Некоторые условия применяются ко всем приведениям типов пространственных объектов, а некоторые — только тогда, когда результатом приведения является определенный пространственный тип. Для получения информации о таких понятиях, как «“корректно сформированная геометрия”», см. Раздел 13.4.4, «Корректность и валидность геометрии».
Общие условия для приведений пространственных типов
Эти условия применяются ко всем приведениям пространственных типов независимо от типа результата:
Результат приведения имеет ту же систему координат, что и выражение, которое преобразуется.
Приведение между пространственными типами не изменяет координаты или порядок.
Если выражение, которое преобразуется, является
NULL, результат функции являетсяNULL.Приведение к пространственным типам с помощью функции
JSON_VALUE()с клаузойRETURNING, указывающей пространственный тип, запрещено.Приведение к
ARRAYпространственных типов запрещено.Если комбинация пространственных типов разрешена, но выражение для преобразования не является синтаксически правильно сформированной геометрией, возникает ошибка.
Если комбинация пространственных типов разрешена, но выражение для преобразования представляет собой синтаксически правильно сформированную геометрию в неопределенной системе координат (SRS), возникает ошибка.
-
Если у выражения, которое преобразуется, есть географическая система координат (SRS), но у долготы или широты превышены пределы, возникает ошибка:
Если значение долготы не находится в диапазоне (−180, 180], возникает ошибка.
Если значение широты не находится в диапазоне [−90, 90], возникает ошибка.
Приведенные диапазоны указаны в градусах. Если в SRS используется другая единица измерения, диапазон использует соответствующие значения в этих единицах. Точные пределы диапазона незначительно отличаются из-за операций с плавающей точкой.
Условия для приведений к точке
Когда типом результата приведения является Point, применяются следующие условия:
Если выражение, которое преобразуется, является корректно сформированной геометрией типа
Point, результат функции являетсяPoint.Если выражение, которое преобразуется, является корректно сформированной геометрией типа
MultiPoint, содержащей однуPoint, результат функции являетсяPoint. Если выражение содержит более однойPoint, возникает ошибка.Если выражение, которое преобразуется, является корректно сформированной геометрией типа
GeometryCollection, содержащей только однуPoint, результат функции являетсяPoint. Если выражение пустое, содержит более однойPointили содержит другие типы геометрии, возникает ошибка.Если выражение, которое преобразуется, является корректно сформированной геометрией, отличной от
Point,MultiPoint,GeometryCollection, возникает ошибка.
Условия для приведений к LineString
Когда типом результата приведения является LineString, применяются следующие условия:
Если выражение для приведения типов является корректно сформированной геометрией типа
LineString, представляющей собой кольцо (то есть начальная и конечная точки совпадают), результат функции — этоPolygonс внешним кольцом, состоящим из точекLineStringв том же порядке. Если выражение не является кольцом, возникает ошибка. Если кольцо не в правильном порядке (внешнее кольцо должно быть против часовой стрелки), возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией типа
Polygon, результат функции — это тоPolygon.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiLineString, где все элементы являются кольцами, результат функции — этоPolygonс первымLineStringв качестве внешнего кольца и любые дополнительные значенияLineStringв качестве внутренних колец. Если какой-либо элемент выражения не является кольцом, возникает ошибка. Если какое-либо кольцо не в правильном порядке (внешнее кольцо должно быть против часовой стрелки, внутренние кольца — по часовой стрелке), возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiPolygon, содержащей одно единственноеPolygon, результат функции — это тоPolygon. Если выражение содержит более одногоPolygon, возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией типа
GeometryCollection, содержащей только одно единственноеPolygon, результат функции — это тоPolygon. Если выражение пустое, содержит более одногоPolygonили содержит другие типы геометрий, возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией другого типа, кроме
LineString,Polygon,MultiLineString,MultiPolygonилиGeometryCollection, возникает ошибка.
Условия для преобразования в MultiPoint
Когда тип результата преобразования — MultiPoint, применяются следующие условия:
Если выражение для приведения типов является корректно сформированной геометрией типа
Point, результат функции — этоMultiPoint, содержащее этоPointв качестве единственного элемента.Если выражение для приведения типов является корректно сформированной геометрией типа
LineString, результат функции — этоMultiPoint, содержащее точкиLineStringв том же порядке.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiPoint, результат функции — это тоMultiPoint.Если выражение для приведения типов является корректно сформированной геометрией типа
GeometryCollection, содержащей только точки, результат функции — этоMultiPoint, содержащее эти точки. ЕслиGeometryCollectionпустое или содержит другие типы геометрий, возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией другого типа, кроме
Point,LineString,MultiPointилиGeometryCollection, возникает ошибка.
Условия для преобразования в MultiLineString
Когда тип результата преобразования — MultiLineString, применяются следующие условия:
Если выражение для приведения типов является корректно сформированной геометрией типа
LineString, результат функции — этоMultiLineString, содержащее этоLineStringв качестве единственного элемента.Если выражение для приведения типов является корректно сформированной геометрией типа
Polygon, результат функции — этоMultiLineString, содержащее внешнее кольцоPolygonв качестве первого элемента и любые внутренние кольца в качестве дополнительных элементов в порядке их появления в выражении.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiLineString, результат функции — это тоMultiLineString.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiPolygon, содержащей только полигоны без внутренних колец, результат функции — этоMultiLineString, содержащее полигоны в порядке их появления в выражении. Если выражение содержит полигоны с внутренними кольцами, возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией типа
GeometryCollection, содержащей только линии, результат функции — этоMultiLineString, содержащее эти линии. Если выражение пустое или содержит другие типы геометрий, возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией другого типа, кроме
LineString,Polygon,MultiLineString,MultiPolygonилиGeometryCollection, возникает ошибка.
Условия для преобразования в MultiPolygon
Когда тип результата преобразования — MultiPolygon, применяются следующие условия:
Если выражение для приведения типов является корректно сформированной геометрией типа
Polygon, результат функции — этоMultiPolygon, содержащееPolygonв качестве единственного элемента.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiLineString, где все элементы являются кольцами, результат функции — этоMultiPolygon, содержащееPolygonс только внешним кольцом для каждого элемента выражения. Если какой-либо элемент не является кольцом, возникает ошибка. Если какое-либо кольцо не в правильном порядке (внешнее кольцо должно быть против часовой стрелки), возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiPolygon, результат функции — это тоMultiPolygon.Если выражение для приведения типов является корректно сформированной геометрией типа
GeometryCollection, содержащей только полигоны, результат функции — этоMultiPolygon, содержащее эти полигоны. Если выражение пустое или содержит другие типы геометрий, возникает ошибка.Если выражение для приведения типов является корректно сформированной геометрией другого типа, кроме
Polygon,MultiLineString,MultiPolygonилиGeometryCollection, возникает ошибка.
Условия для преобразования в GeometryCollection
Когда тип результата преобразования — GeometryCollection, применяются следующие условия:
GeometryCollectionиGeomCollectionявляются синонимами для одного и того же типа результата.Если выражение для приведения типов является корректно сформированной геометрией типа
Point, результат функции — этоGeometryCollection, содержащее этоPointв качестве единственного элемента.Если выражение для приведения типов является корректно сформированной геометрией типа
LineString, результат функции — этоGeometryCollection, содержащее этоLineStringв качестве единственного элемента.Если выражение для приведения типов является корректно сформированной геометрией типа
Polygon, результат функции — этоGeometryCollection, содержащее этоPolygonв качестве единственного элемента.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiPoint, результат функции — этоGeometryCollection, содержащее точки в порядке их появления в выражении.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiLineString, результат функции — этоGeometryCollection, содержащее линии в порядке их появления в выражении.Если выражение для приведения типов является корректно сформированной геометрией типа
MultiPolygon, результат функции — этоGeometryCollection, содержащее элементыMultiPolygonв порядке их появления в выражении.Если выражение для приведения типов является корректно сформированной геометрией типа
GeometryCollection, результат функции — это тоGeometryCollection.
Другие способы использования операций преобразования типов
Функции преобразования типов полезны для создания столбца с определенным типом в операторе CREATE TABLE ...
SELECT:
mysql> CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE) AS c1;
mysql> SHOW CREATE TABLE new_table\G
*************************** 1. row ***************************
Table: new_table
Create Table: CREATE TABLE `new_table` (
`c1` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Функции преобразования типов полезны для сортировки столбцов ENUM в лексикографическом порядке. Обычно сортировка столбцов ENUM происходит с использованием внутренних числовых значений. Преобразование значений в тип CHAR приводит к лексикографической сортировке:
SELECT enum_col FROM tbl_name
ORDER BY CAST(enum_col AS CHAR);
CAST() также изменяет результат, если используется в составе более сложного выражения, например, CONCAT('Date: ',CAST(NOW() AS
DATE)).
Для временных значений использование CAST() для извлечения данных в разных форматах нецелесообразно. Вместо этого используйте функции, такие как EXTRACT(), DATE_FORMAT() или TIME_FORMAT(). Смотрите Раздел 14.7, «Функции даты и времени».
Для преобразования строки в число обычно достаточно использовать строковое значение в числовом контексте:
mysql> SELECT 1+'1';
-> 2
Это также верно для шестнадцатеричных и битовых литералов, которые по умолчанию являются двоичными строками:
mysql> SELECT X'41', X'41'+0;
-> 'A', 65
mysql> SELECT b'1100001', b'1100001'+0;
-> 'a', 97
Строка, используемая в арифметической операции, преобразуется в число с плавающей точкой во время вычисления выражения.
Число, используемое в строковом контексте, преобразуется в строку:
mysql> SELECT CONCAT('hello you ',2);
-> 'hello you 2'
Дополнительную информацию об неявном преобразовании чисел в строки см. в Разделе 14.3, «Преобразование типов в выражениях».
MySQL поддерживает арифметические операции с 64-разрядными значениями со знаком и без знака. Для арифметических операторов (таких как + или -), где один из операндов является целым числом без знака, результат по умолчанию является беззнаковым (см. Раздел 14.6.1, «Арифметические операторы»). Для переопределения этого используйте оператор преобразования SIGNED или UNSIGNED для преобразования значения в целое число со знаком или без знака соответственно.
mysql> SELECT 1 - 2;
-> -1
mysql> SELECT CAST(1 - 2 AS UNSIGNED);
-> 18446744073709551615
mysql> SELECT CAST(CAST(1 - 2 AS UNSIGNED) AS SIGNED);
-> -1
Если какой-либо операнд имеет значение с плавающей точкой, результатом будет значение с плавающей точкой, и на него не распространяется предыдущее правило. (В данном контексте значения столбцов DECIMAL рассматриваются как значения с плавающей точкой.)
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;
-> -1.0
Режим SQL влияет на результаты операций преобразования (см. Раздел 7.1.11, «Режимы SQL сервера»). Примеры:
При преобразовании строки даты “ноль” в дату,
CONVERT()иCAST()возвращаютNULLи выдают предупреждение, когда режим SQLNO_ZERO_DATEвключен.При вычитании целых чисел, если режим SQL
NO_UNSIGNED_SUBTRACTIONвключен, результат вычитания будет со знаком, даже если какой-либо операнд является беззнаковым.
© 2025 Oracle
Licensed under the GPLv2 License.