Spec-Zone.ru › MySQL 5.7

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

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

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

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

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

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

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

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

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

  • BINARY expr

    Оператор BINARY преобразует выражение в строку в двоичном формате (строка, имеющая наборы символов binary и сортировку binary). Часто оператор BINARY используется для принудительного выполнения сравнения строк побайтово с использованием числовых значений байтов вместо сравнения посимвольно. Оператор BINARY также учитывает конечные пробелы при сравнении. Дополнительную информацию о различиях между сортировкой binary набора символов binary и сортировками _bin для наборов символов, не являющихся двоичными, см. в разделе 10.8.5 «Сравнение двоичной сортировки с сортировками _bin».

    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
    

    Дополнительную информацию об обозначителях см. в разделе 10.3.8 «Ввод наборов символов».

    Оператор BINARY в выражениях отличается по эффекту от атрибута BINARY в определениях столбцов символьного типа. Для столбца символьного типа, определенного с атрибутом BINARY, MySQL использует настроенный набор символов таблицы и двоичную (_bin) сортировку этого набора символов. Каждый набор символов, не являющийся двоичным, имеет сортировку _bin. Например, если настроенный набор символов таблицы — utf8, эти два определения столбцов эквивалентны:

    CHAR(10) BINARY
    CHAR(10) CHARACTER SET utf8 COLLATE utf8_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. Дополнительную информацию об этом параметре см. в разделе 4.5.1 «mysql — Клиентская программа командной строки MySQL».

  • CAST(expr AS type)

    CAST(expr AS type принимает выражение любого типа и возвращает значение результата указанного типа. Эта операция также может быть выражена как CONVERT(expr, type), что эквивалентно.

    Допустимы следующие значения type:

    • BINARY[(N)]

      Возвращает строку с типом данных VARBINARY, за исключением случаев, когда выражение expr пустое (длина равна нулю), в этом случае тип результата — BINARY(0). Если указана необязательная длина N, то BINARY(N) приводит к тому, что преобразование использует не более N байтов аргумента. Значения, короче N байтов, дополняются 0x00 байтами до длины N. Если необязательная длина N не указана, MySQL вычисляет максимальную длину из выражения. Если указанная или вычисленная длина превышает внутренний порог, тип результата — BLOB. Если длина по-прежнему слишком велика, тип результата — LONGBLOB.

      Описание того, как приведение к типу BINARY влияет на сравнения, см. в разделе 11.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.

    • JSON

      Возвращает значение типа JSON. Подробную информацию о правилах преобразования значений между JSON и другими типами см. в разделе «Сравнение и упорядочивание JSON-значений».

    • NCHAR[(N)]

      Аналогично CHAR, но возвращает строку с национальным набором символов. См. раздел 10.3.7 «Национальный набор символов».

      В отличие от CHAR, NCHAR не позволяет указывать информацию о наборе символов в конце.

    • SIGNED [INTEGER]

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

    • TIME[(M)]

      Возвращает значение типа TIME. Если указано необязательное значение M, оно определяет точность дробных секунд.

    • UNSIGNED [INTEGER]

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

  • CONVERT(expr USING transcoding_name)

    CONVERT(expr,type)

    CONVERT(expr USING transcoding_name) — это стандартный синтаксис SQL. Не-USING форма CONVERT() — это синтаксис ODBC.

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

    SELECT CONVERT('abc' USING utf8);
    

    Синтаксис CONVERT(expr, type) (без USING) принимает выражение и значение type, определяющее тип результата, и генерирует значение результата указанного типа. Это действие также можно выразить как CAST(expr AS type), что эквивалентно. Дополнительную информацию см. в описании CAST().

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

CONVERT() с клаузой USING преобразует данные между наборами символов:

CONVERT(expr USING transcoding_name)

В MySQL имена транскодирования совпадают с именами соответствующих наборов символов.

Примеры:

SELECT CONVERT('test' USING utf8);
SELECT CONVERT(_latin1'Müller' USING utf8);
INSERT INTO utf8_table (utf8_column)
    SELECT CONVERT(latin1_column USING utf8) 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 utf8);
SELECT CAST('test' AS CHAR CHARACTER SET utf8);

Если вы укажете CHARACTER SET charset_name, как показано выше, набор символов и сортировка результата — это charset_name и сортировка по умолчанию charset_name. Если вы опустите CHARACTER SET charset_name, набор символов и сортировка результата определяются системными переменными character_set_connection и collation_connection, которые определяют набор символов соединения по умолчанию и сортировку (см. Раздел 10.4, «Наборы символов соединения и сортировки»).

Клауза COLLATE не допускается внутри вызова CONVERT() или CAST(), но вы можете применить её к результату функции. Например, следующие варианты допустимы:

SELECT CONVERT('test' USING utf8) COLLATE utf8_bin;
SELECT CONVERT('test', CHAR CHARACTER SET utf8) COLLATE utf8_bin;
SELECT CAST('test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

Но эти варианты недопустимы:

SELECT CONVERT('test' USING utf8 COLLATE utf8_bin);
SELECT CONVERT('test', CHAR CHARACTER SET utf8 COLLATE utf8_bin);
SELECT CAST('test' AS CHAR CHARACTER SET utf8 COLLATE utf8_bin);

Для строковых литералов другой способ указать набор символов — использовать ввод набора символов. _latin1 и _latin2 в предыдущем примере являются примерами таких вводов. В отличие от функций преобразования, таких как CAST() или CONVERT(), которые преобразуют строку из одного набора символов в другой, ввод набора символов обозначает строковый литерал, имеющий определённый набор символов, без преобразования. Для получения дополнительной информации см. Раздел 10.3.8, «Вводы наборов символов».

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

Обычно вы не можете сравнить значение BLOB или другую бинарную строку в режиме без учёта регистра, потому что бинарные строки используют набор символов binary, который не имеет сортировки с понятием регистра. Для выполнения сравнения без учёта регистра сначала используйте функцию CONVERT() или CAST(), чтобы преобразовать значение в небинарную строку. Сравнения полученной строки используют её сортировку. Например, если сортировка результата преобразования нечувствительна к регистру, операция LIKE также нечувствительна к регистру. Это верно для следующей операции, потому что сортировка по умолчанию latin1 (latin1_swedish_ci) нечувствительна к регистру:

SELECT 'A' LIKE CONVERT(blob_col USING latin1)
  FROM tbl_name;

Чтобы указать конкретную сортировку для преобразованной строки, используйте клаузу COLLATE после вызова CONVERT():

SELECT 'A' LIKE CONVERT(blob_col USING latin1) COLLATE latin1_german1_ci
  FROM tbl_name;

Чтобы использовать другой набор символов, замените его имя на latin1 в предыдущих утверждениях (и аналогично для использования другой сортировки).

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 latin1));
+-------------+-----------------------------------+
| LOWER(@str) | LOWER(CONVERT(@str USING latin1)) |
+-------------+-----------------------------------+
| New York    | new york                          |
+-------------+-----------------------------------+

Имейте в виду, что если вы применяете BINARY, CAST() или CONVERT() к индексированному столбцу, MySQL может неэффективно использовать индекс.

END_OF_DOCUMENT_MARKER

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

Функции приведения типов полезны для создания столбца с определённым типом в операторе 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=latin1

Функции приведения типов полезны для сортировки столбцов типа 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(). См. Раздел 12.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'

Дополнительную информацию об неявном преобразовании чисел в строки см. в Разделе 12.3, «Преобразование типов в выражениях».

MySQL поддерживает арифметические операции с 64-битными значениями со знаком и без знака. Для арифметических операторов (таких как + или -), где один из операндов — целое без знака, результат по умолчанию без знака (см. Раздел 12.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 влияет на результат операций преобразования (см. Раздел 5.1.10, «Режимы 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-5.7-en/cast-functions.html

Spec-Zone.ru

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