Spec-Zone.ru › MySQL 8.4

14.10 Функции и операторы приведения типов

Таблица 14.15 Функции и операторы приведения типов

Таблица 14.15 Функции и операторы приведения типов
Имя Описание Устарело
BINARY Преобразовать строку в бинарную строку Да
CAST() Привести значение к определённому типу
CONVERT() Привести значение к определённому типу

Функции и операторы приведения типов позволяют преобразовывать значения из одного типа данных в другой.

  • Описание функций и операторов приведения типов

  • Преобразования наборов символов

  • Преобразования наборов символов для сравнения строк

  • Операции приведения типов пространственных типов

  • Другие применения операций приведения типов

Описание функций и операторов приведения типов

  • BINARY expr

    Оператор 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(expr USING BINARY)
    CAST(expr AS BINARY)
    BINARY expr
    

    Если значение является строковой константой, его можно обозначить как бинарную строку без преобразования, используя ввод набора символов _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».

END_OF_DOCUMENT_MARKER
  • CAST(expr AS type [ARRAY])

    CAST(timestamp_value AT TIME ZONE timezone_specifier AS DATETIME[(precision)])

    timezone_specifier: [INTERVAL] '+00:00' | 'UTC'

    С синтаксисом CAST(expr AS type, функция CAST() принимает выражение любого типа и возвращает значение указанного типа. Данную операцию также можно записать как 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_name: Возвращает строку с указанным набором символов.

      • ASCII: Краткая форма для 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, если включен режим SQL REAL_AS_FLOAT; в противном случае результат имеет тип DOUBLE.

    • SIGNED [INTEGER]

      Возвращает целое со знаком BIGINT.

    • spatial_type

      CAST() и 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 |
        +---------------------+---------------------+
        
      • Аргумент типа GEOMETRY не может быть преобразован в YEAR.

      • Для значений, которые не могут быть успешно преобразованы в 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(expr USING transcoding_name)

    CONVERT(expr,type)

    CONVERT(expr USING transcoding_name) — это стандартный синтаксис SQL. Не-USING форма CONVERT() — это синтаксис ODBC. Независимо от используемого синтаксиса, функция возвращает NULL, если expr равно NULL.

    CONVERT(expr USING transcoding_name) преобразует данные между различными наборами символов. В MySQL имена транскодирования совпадают с соответствующими именами наборов символов. Например, этот оператор преобразует строку 'abc' в наборе символов по умолчанию в соответствующую строку в наборе символов utf8mb4:

    SELECT CONVERT('abc' USING utf8mb4);
    

    CONVERT(expr, type) синтаксис (без USING) принимает выражение и значение type, определяющее тип результата, и генерирует результат указанного типа. Эта операция также может быть выражена как CAST(expr AS type), что эквивалентно. Для получения дополнительной информации см. описание 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_name, как показано выше, набор символов и сортировка результата будут charset_name и сортировка по умолчанию для charset_name. Если вы опустите CHARACTER SET charset_name, набор символов и сортировка результата определяются системными переменными character_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, «Вводные символы набора символов».

END_OF_DOCUMENT_MARKER ```

Преобразования наборов символов для сравнения строк

Обычно вы не можете сравнивать значение 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 в:

    • MultiPoint

    • GeometryCollection

  • Из LineString в:

    • Polygon (расширение MySQL)

    • MultiPoint (расширение MySQL)

    • MultiLineString

    • GeometryCollection

  • Из Polygon в:

    • LineString (расширение MySQL)

    • MultiLineString (расширение MySQL)

    • MultiPolygon

    • GeometryCollection

  • Из MultiPoint в:

    • Point

    • LineString (расширение MySQL)

    • GeometryCollection

  • Из MultiLineString в:

    • LineString

    • Polygon (расширение MySQL)

    • MultiPolygon (расширение MySQL)

    • GeometryCollection

  • Из MultiPolygon в:

    • Polygon

    • MultiLineString (расширение MySQL)

    • GeometryCollection

  • Из GeometryCollection в:

    • Point

    • LineString

    • Polygon

    • MultiPoint

    • MultiLineString

    • MultiPolygon

При приведении пространственных типов, GeometryCollection и GeomCollection являются синонимами для одного и того же типа результата.

Некоторые условия применяются ко всем приведениям типов пространственных объектов, а некоторые — только тогда, когда результатом приведения является определенный пространственный тип. Для получения информации о таких понятиях, как «“корректно сформированная геометрия”», см. Раздел 13.4.4, «Корректность и валидность геометрии».

  • Общие условия для приведений пространственных типов

  • Условия для приведений к точке

  • Условия для приведений к LineString

  • Условия для приведений к Polygon

  • Условия для приведений к MultiPoint

  • Условия для приведений к MultiLineString

  • Условия для приведений к MultiPolygon

  • Условия для приведений к GeometryCollection

Общие условия для приведений пространственных типов

Эти условия применяются ко всем приведениям пространственных типов независимо от типа результата:

  • Результат приведения имеет ту же систему координат, что и выражение, которое преобразуется.

  • Приведение между пространственными типами не изменяет координаты или порядок.

  • Если выражение, которое преобразуется, является 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 и выдают предупреждение, когда режим SQL NO_ZERO_DATE включен.

  • При вычитании целых чисел, если режим SQL NO_UNSIGNED_SUBTRACTION включен, результат вычитания будет со знаком, даже если какой-либо операнд является беззнаковым.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/cast-functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API