## 12.11 转换函数和运算符

[](<>)[](<>)[](<>)[](<>)[](<>)

[](<>)

**表 12.15 转换函数和运算符**

| 姓名 | 描述 | 已弃用 |
| --- | --- | --- |
| [`二进制`](cast-functions.html#operator_binary) | 将字符串转换为二进制字符串 | 8.0.27 |
| [`投掷（）`](cast-functions.html#function_cast) | 将值转换为特定类型 |  |
| [`转变（）`](cast-functions.html#function_convert) | 将值转换为特定类型 |  |

Cast 函数和运算符支持将值从一种数据类型转换为另一种数据类型。

-   [强制转换函数和运算符说明](cast-functions.html#cast-function-descriptions)

-   [字符集转换](cast-functions.html#cast-character-set-conversions)

-   [字符串比较的字符集转换](cast-functions.html#cast-string-comparisons)

-   [空间类型的转换操作](cast-functions.html#cast-spatial-types)

-   [铸造操作的其他用途](cast-functions.html#cast-other-uses)

### 强制转换函数和运算符说明

-   [](<>)

    [`二进制`](cast-functions.html#operator_binary) *`表达式`*

    [](<>)

    这[`二进制`](cast-functions.html#operator_binary)运算符将表达式转换为二进制字符串（具有`二进制`字符集和`二进制`整理）。一个常见的用途[`二进制`](cast-functions.html#operator_binary)是强制使用数字字节值而不是逐个字符地逐个字节地完成字符串比较。这[`二进制`](cast-functions.html#operator_binary)运算符还会导致比较中的尾随空格很重要。有关两者之间差异的信息`二进制`整理的`二进制`字符集和`_bin`非二进制字符集的排序规则，请参见[第 10.8.5 节，“与\_分类整理”](charset-binary-collations.html).

    这`二进制`从 MySQL 8.0.27 开始不推荐使用运算符，您应该期望在 MySQL 的未来版本中将其删除。采用[`演员（...作为二进制）`](cast-functions.html#function_cast)反而。

    ```
    mysql> SELECT 'a' = 'A';
            -> 1
    mysql> SELECT BINARY 'a' = 'A';
            -> 0
    mysql> SELECT 'a' = 'a ';
            -> 1
    mysql> SELECT BINARY 'a' = 'a ';
            -> 0
    ```

    相比之下，[`二进制`](cast-functions.html#operator_binary)影响整个操作；它可以在任何一个操作数之前给出，结果相同。

    要将字符串表达式转换为二进制字符串，这些构造是等效的：

    ```
    CONVERT(expr USING BINARY)
    CAST(expr AS BINARY)
    BINARY expr
    ```

    如果一个值是一个字符串字面量，它可以被指定为一个二进制字符串，而不用通过使用`_二进制`字符集介绍器：

    ```
    mysql> SELECT 'a' = 'A';
            -> 1
    mysql> SELECT _binary 'a' = 'A';
            -> 0
    ```

    有关介绍人的信息，请参阅[第 10.3.8 节，“字符集介绍器”](charset-introducer.html).

    这[`二进制`](cast-functions.html#operator_binary)表达式中的运算符在效果上不同于`二进制`字符列定义中的属性。对于用`二进制`属性，MySQL 分配表默认字符集和二进制 (`_bin`) 该字符集的排序规则。每个非二进制字符集都有一个`_bin`整理。例如，如果表默认字符集是`utf8mb4`，这两个列定义是等价的：

    ```
    CHAR(10) BINARY
    CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
    ```

    指某东西的用途`字符集二进制`在定义一个[`字符`](char.html),[`VARCHAR`](char.html)， 要么[`文本`](blob.html)column 导致该列被视为相应的二进制字符串数据类型。例如，下面的定义对是等价的：

    ```
    CHAR(10) CHARACTER SET binary
    BINARY(10)

    VARCHAR(10) CHARACTER SET binary
    VARBINARY(10)

    TEXT CHARACTER SET binary
    BLOB
    ```

    如果[`二进制`](cast-functions.html#operator_binary)从内部调用[**mysql**](mysql.html)客户端，二进制字符串使用十六进制表示法显示，具体取决于[`--binary-as-hex`](mysql-command-options.html#option_mysql_binary-as-hex).有关该选项的更多信息，请参阅[第 4.5.1 节，“mysql - MySQL 命令行客户端”](mysql.html).

-   [](<>)

    [`投掷（*`表达式`*作为*`类型`*[阵列]）`](cast-functions.html#function_cast)

    [`投下(*`时间戳\_值`*在时区*`时区\_说明符`*作为约会时间[(*`精确`*)])`](cast-functions.html#function_cast)

    *`时区_说明符`*:[间隔]“+00:00”|“UTC”

    [](<>)

    具有[`投下(*`expr`*作为*`类型`*`](cast-functions.html#function_cast)语法[`演员阵容`](cast-functions.html#function_cast)函数接受任何类型的表达式，并生成指定类型的结果值。该操作也可以表示为[`皈依(*`expr`*, *`类型`*)`](cast-functions.html#function_convert)，这是等效的。

    这些*`类型`*允许使用以下值：

    -   `二进制的[(*`N`*)]`

        使用[`VARBINARY`](binary-varbinary.html)数据类型，但当表达式*`expr`*为空（长度为零），结果类型为`二进制（0）`.如果可选长度*`N`*被给予，`二进制的(*`N`*)`使演员组使用不超过*`N`*参数的字节数。值小于*`N`*字节中填充了`0x00`字节到的长度*`N`*.如果可选长度*`N`*如果未给定，MySQL将根据表达式计算最大长度。如果提供的或计算的长度大于内部阈值，则结果类型为`斑点`。如果长度仍然太长，则结果类型为`长条`.

        有关如何进行强制转换的说明`二进制的`影响比较，请参见[第11.3.3节，“二进制和变量二进制类型”](binary-varbinary.html).

    -   `炭[(*`N`*)] [*`charset\_信息`*]`

        使用[`瓦尔查尔`](char.html)数据类型。除了当*`expr`*为空（长度为零），结果类型为`字符（0）`.如果可选长度*`N`*被给予，`炭(*`N`*)`使演员组使用不超过*`N`*论点的特点。小于的值不进行填充*`N`*角色。如果可选长度*`N`*如果未给定，MySQL将根据表达式计算最大长度。如果提供的或计算的长度大于内部阈值，则结果类型为`文本`。如果长度仍然太长，则结果类型为`长文`.

        没有*`charset_信息`*条款`烧焦`生成具有默认字符集的字符串。要显式指定字符集，请执行以下操作：*`charset_信息`*允许使用以下值：

        -   `字符集*`charset\_名称`*`：生成具有给定字符集的字符串。

        -   `ASCII码`：简写`拉丁字符集1`.

        -   `UNICODE`：简写`字符集ucs2`.

            在所有情况下，字符串都具有字符集默认排序规则。

    -   `日期`

        产生一个[`日期`](datetime.html)价值

    -   `约会时间[(*`M`*)]`

        产生一个[`约会时间`](datetime.html)价值如果可选*`M`*值，它指定了小数秒的精度。

    -   `小数点[(*`M`*[,*`D`*])]`

        产生一个[`十进制的`](fixed-point-types.html)价值如果可选*`M`*和*`D`*给定值时，它们指定最大位数（精度）和小数点后的位数（刻度）。如果*`D`*如果省略，则假定为0。如果*`M`*省略，假设为10。

    -   `双重的`

        产生一个[`双重的`](floating-point-types.html)后果在MySQL 8.0.17中添加。

    -   `漂浮[(*`p`*)]`

        如果精度*`p`*未指定，则生成类型为的结果[`浮动`](floating-point-types.html)如果*`p`*提供0\\\<=\\\<*`p`*\\\<=24，结果为类型`浮动`.如果25\\\<=*`p`*\\\<=53，结果为类型[`双重的`](floating-point-types.html)如果*`p`*\\\<0或*`p`* >53，返回一个错误。在MySQL 8.0.17中添加。

    -   `JSON`

        产生一个[`JSON`](json.html)价值有关在之间转换值的规则的详细信息[`JSON`](json.html)以及其他类型，请参见[JSON值的比较和排序](json.html#json-comparison).

    -   `恩查尔[(*`N`*)]`

        喜欢`烧焦`，但生成具有国家字符集的字符串。看见[第10.3.7节，“民族性格集”](charset-national.html).

        不像`烧焦`, `恩查尔`不允许指定尾随字符集信息。

    -   `真实的`

        生成类型的结果[`真实的`](floating-point-types.html).这实际上是`浮动`如果`真正的_AS_FLOAT`SQL模式已启用；否则，结果就是类型`双重的`.

    -   `有符号[整数]`

        生成签名[`比金`](integer-types.html)价值

    -   *`空间型`*

        从MySQL 8.0.24开始，[`演员阵容`](cast-functions.html#function_cast)和[`CONVERT（）`](cast-functions.html#function_convert)对于空间类型的某些组合，支持将几何图形值从一种空间类型转换为另一种空间类型。有关详细信息，请参阅[对空间类型的强制转换操作](cast-functions.html#cast-spatial-types).

    -   `时间[(*`M`*)]`

        产生一个[`时间`](time.html)价值如果可选*`M`*值，它指定了小数秒的精度。

    -   `无符号[整数]`

        生成一个未签名的[`比金`](integer-types.html)价值

    -   `年`

        产生一个[`年`](year.html)价值在MySQL 8.0.22中添加。这些规则适用于转换为`年`:

        -   对于1901-2155（含1901-2155）范围内的四位数字，或对于可解释为该范围内四位数字的字符串，返回相应的`年`价值

        -   对于由一个或两个数字组成的数字，或者对于可以解释为这样一个数字的字符串，返回`年`价值如下：

            -   如果数字在1-69（含1-69）之间，请加2000并返回总和。

            -   如果数字在70-99（含70-99）之间，则加1900并返回总和。

        -   对于计算结果为0的字符串，返回2000。

        -   对于数字0，返回0。

        -   暂时[`日期`](datetime.html), [`约会时间`](datetime.html)或[`时间戳`](datetime.html)值，返回`年`价值的一部分。暂时[`时间`](time.html)值，返回当前年份。

            如果未指定`时间`参数，您可能会得到与预期不同的结果，如下所示：

            ```
            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 |
            +--------------------------+-------------------------------+
            ```

        -   如果参数的类型为[`十进制的`](fixed-point-types.html), [`双重的`](floating-point-types.html), [`十进制的`](fixed-point-types.html)或[`真实的`](floating-point-types.html)，将该值四舍五入为最接近的整数，然后尝试将该值强制转换为`年`使用整数值规则，如下所示：

            ```
            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 |
            +---------------------+---------------------+
            ```

        -   类型的论点[`几何学`](spatial-type-overview.html)无法转换为[`年`](year.html).

        -   对于无法成功转换为的值`年`回来`无效的`.

            包含非数字字符的字符串值在转换前必须被截断，会引发警告，如下所示：

            ```
            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' |
            +---------+------+-------------------------------------------+
            ```

        在MySQL 8.0.17及更高版本中，[`InnoDB`](innodb-storage-engine.html)允许使用额外的`大堆`用于在上创建多值索引的关键字[`JSON`](json.html)数组作为[`创建索引`](create-index.html), [`创建表格`](create-table.html)和[`改变桌子`](alter-table.html)声明。`大堆`不支持，除非用于在其中一条语句中创建多值索引，在这种情况下是必需的。要编制索引的列必须是类型为的列`JSON`具有`大堆`这个*`类型`*遵循`像`关键字可以指定`演员阵容`，但`二进制的`, `JSON`和`年`。有关语法信息和示例以及其他相关信息，请参阅[多值索引](create-index.html#create-index-multi-valued).

    笔记

    [`CONVERT（）`](cast-functions.html#function_convert)不像[`演员阵容`](cast-functions.html#function_cast)做*不*支持多值索引创建或`大堆`关键词。

    从MySQL 8.0.22开始，`演员阵容`支持检索[`时间戳`](datetime.html)在UTC中使用`时区`操作人员唯一受支持的时区是UTC；这可以指定为`'+00:00'`或`“UTC”`。此语法支持的唯一返回类型是`约会时间`，可选精度说明符的范围为0到6（含）。

    `时间戳`还支持使用时区偏移的值。

    ```
    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”`作为具有这种形式的`演员阵容`，服务器会引发一个错误，例如未知或不正确的时区：“UTC”，您可能需要安装MySQL时区表（请参阅[填充时区表](time-zone-support.html#time-zone-installation)).

    `在时区`不支持`大堆`关键字，并且不受[`CONVERT（）`](cast-functions.html#function_convert)作用

-   [](<>)

    [`皈依(*`expr`*使用*`转码`*)`](cast-functions.html#function_convert)

    [`皈依(*`expr`*,*`类型`*)`](cast-functions.html#function_convert)

    [](<>)

    [`皈依(*`expr`*使用*`转码`*)`](cast-functions.html#function_convert)是标准的SQL语法。非-`使用`形式[`CONVERT（）`](cast-functions.html#function_convert)是ODBC语法。

    [`皈依(*`expr`*使用*`转码`*)`](cast-functions.html#function_convert)在不同的字符集之间转换数据。在MySQL中，转码名称与相应的字符集名称相同。例如，此语句转换字符串`“abc”`在默认字符集中设置为`utf8mb4`字符集：

    ```
    SELECT CONVERT('abc' USING utf8mb4);
    ```

    [`皈依(*`expr`*, *`类型`*)`](cast-functions.html#function_convert)语法（没有`使用`)带着表情和表情*`类型`*值指定结果类型，并生成指定类型的结果值。该操作也可以表示为[`投下(*`expr`*作为*`类型`*)`](cast-functions.html#function_cast)，这是等效的。有关详细信息，请参见的说明[`演员阵容`](cast-functions.html#function_cast).

    笔记

    在MySQL 8.0.28之前，此函数有时允许对[`二进制的`](binary-varbinary.html)非二进制字符集的值。什么时候`CONVERT（）`被用作索引生成列的表达式的一部分，这可能会导致从以前版本的MySQL升级后索引损坏。看见[SQL更改](upgrading-from-previous-series.html#upgrade-sql-changes)，以获取有关如何处理这种情况的信息。

### 字符集转换

[`CONVERT（）`](cast-functions.html#function_convert)用一个`使用`子句在字符集之间转换数据：

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

要在字符集之间转换字符串，还可以使用[`皈依(*`expr`*, *`类型`*)`](cast-functions.html#function_convert)语法（没有`使用`)，或[`投下(*`expr`*作为*`类型`*)`](cast-functions.html#function_cast)，相当于：

```
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);
```

如果你指定`字符集*`charset\_名称`*`如前所示，结果的字符集和排序规则如下所示*`charset_名称`*以及*`charset_名称`*.如果你忽略了`字符集*`charset\_名称`*`，结果的字符集和排序规则由[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)和[`校对连接`](server-system-variables.html#sysvar_collation_connection)确定默认连接字符集和排序规则的系统变量（请参阅[第10.4节，“连接字符集和排序规则”](charset-connection.html)).

A.`整理`条款不允许在[`CONVERT（）`](cast-functions.html#function_convert)或[`演员阵容`](cast-functions.html#function_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);
```

对于字符串文字，指定字符集的另一种方法是使用字符集引入器。`_拉丁语1`和`_拉丁语2`在前面的例子中是介绍人的例子。与转换函数不同，例如[`演员阵容`](cast-functions.html#function_cast)或[`CONVERT（）`](cast-functions.html#function_convert)，将字符串从一个字符集转换为另一个字符集，介绍人将字符串文字指定为具有特定的字符集，而不涉及转换。有关更多信息，请参阅[第10.3.8节，“字符集介绍人”](charset-introducer.html).

### 用于字符串比较的字符集转换

通常情况下，你无法比较[`斑点`](blob.html)值或其他不区分大小写的二进制字符串，因为二进制字符串使用`二进制的`字符集，与字母箱的概念不一致。要执行不区分大小写的比较，请首先使用[`CONVERT（）`](cast-functions.html#function_convert)或[`演员阵容`](cast-functions.html#function_cast)函数将值转换为非二进制字符串。结果字符串的比较使用其排序规则。例如，如果转换结果排序规则不区分大小写，则[`喜欢`](string-comparison-functions.html#operator_like)操作不区分大小写。对于以下操作，这是正确的，因为默认`utf8mb4`校勘(`utf8mb4_0900_ai_ci`)不区分大小写：

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

要为转换后的字符串指定特定的排序规则，请使用`整理`下列条款[`CONVERT（）`](cast-functions.html#function_convert)电话：

```
SELECT 'A' LIKE CONVERT(blob_col USING utf8mb4) COLLATE utf8mb4_unicode_ci
  FROM tbl_name;
```

要使用不同的字符集，请将其名称替换为`utf8mb4`在前面的语句中（同样使用不同的排序规则）。

[`CONVERT（）`](cast-functions.html#function_convert)和[`演员阵容`](cast-functions.html#function_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 |
+---------------------------------+
```

字符集转换在二进制字符串的字母表壳转换之前也很有用。[`下（）`](string-functions.html#function_lower)和[`上（）`](string-functions.html#function_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                           |
+-------------+------------------------------------+
```

请注意，如果你申请[`二进制的`](cast-functions.html#operator_binary), [`演员阵容`](cast-functions.html#function_cast)或[`CONVERT（）`](cast-functions.html#function_convert)对于索引列，MySQL可能无法有效地使用索引。

### 对空间类型的强制转换操作

从MySQL 8.0.24开始，[`演员阵容`](cast-functions.html#function_cast)和[`CONVERT（）`](cast-functions.html#function_convert)对于空间类型的某些组合，支持将几何图形值从一种空间类型转换为另一种空间类型。下面的列表显示了允许的类型组合，其中“MySQL扩展”指定在MySQL中实现的类型转换，而不是在[SQL/MM标准](spatial-types.html):

-   从…起`指向`致：

    -   `多点`

    -   `混合数据类型`

-   从…起`线绳`致：

    -   `多边形`（MySQL扩展）

    -   `多点`（MySQL扩展）

    -   `线集合`

    -   `混合数据类型`

-   从…起`多边形`致：

    -   `线绳`（MySQL扩展）

    -   `线集合`（MySQL扩展）

    -   `多面`

    -   `混合数据类型`

-   从…起`多点`致：

    -   `指向`

    -   `线绳`（MySQL扩展）

    -   `混合数据类型`

-   从…起`线集合`致：

    -   `线绳`

    -   `多边形`（MySQL扩展）

    -   `多面`（MySQL扩展）

    -   `混合数据类型`

-   从…起`多面`致：

    -   `多边形`

    -   `线集合`（MySQL扩展）

    -   `混合数据类型`

-   从…起`混合数据类型`致：

    -   `指向`

    -   `线绳`

    -   `多边形`

    -   `多点`

    -   `线集合`

    -   `多面`

    在空间投射中，`混合数据类型`和`GeomCollection`是同一结果类型的同义词。

    有些条件适用于所有空间类型强制转换，有些条件仅在强制转换结果为具有特定空间类型时适用。有关“格式良好的几何体”等术语的信息，请参见[第11.4.4节，“几何良好形式和有效性”](geometry-well-formedness-validity.html).

-   [空间投射的一般条件](cast-functions.html#spatial-cast-general-conditions)

-   [强制转换到点的条件](cast-functions.html#spatial-cast-point-conditions)

-   [转换为LineString的条件](cast-functions.html#spatial-cast-linestring-conditions)

-   [多边形强制转换的条件](cast-functions.html#spatial-cast-polygon-conditions)

-   [多点强制转换的条件](cast-functions.html#spatial-cast-multipoint-conditions)

-   [从强制转换到多重约束的条件](cast-functions.html#spatial-cast-multilinestring-conditions)

-   [多多边形强制转换的条件](cast-functions.html#spatial-cast-multipolygon-conditions)

-   [GeometryCollection的强制转换条件](cast-functions.html#spatial-cast-geometrycollection-conditions)

#### 空间投射的一般条件

无论结果类型如何，这些条件都适用于所有空间强制转换：

-   强制转换的结果与要强制转换的表达式的结果在相同的SRS中。

-   在空间类型之间转换不会更改坐标值或顺序。

-   如果要使用的表达式是`无效的`，函数结果为`无效的`.

-   使用[`JSON_值（）`](json-search-functions.html#function_json-value)具有`返回`不允许使用指定空间类型的子句。

-   投球`大堆`不允许使用空间类型。

-   如果允许空间类型组合，但要转换的表达式不是语法良好的几何体，则[`ER_GIS_无效_数据`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_gis_invalid_data)发生错误。

-   如果允许空间类型组合，但要转换的表达式是未定义空间参考系（SRS）中语法良好的几何体，则[`ER_SRS_未找到`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_srs_not_found)发生错误。

-   如果要强制转换的表达式具有地理SRS，但其经度或纬度超出范围，则会发生错误：

    -   如果经度值不在范围内(−180，180]，一个[`几何参数经度超出范围`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_geometry_param_longitude_out_of_range)发生错误。

    -   如果纬度值不在范围内[−90, 90]一[`几何参数纬度超出范围`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_geometry_param_latitude_out_of_range)发生错误。

        显示的范围以度为单位。如果SRS使用另一个单位，则范围使用其单位中的相应值。由于采用浮点运算，精确的范围限制略有偏差。

#### 强制转换到点的条件

当强制转换结果类型为`指向`，这些条件适用：

-   如果要转换的表达式是类型为的格式良好的几何体`指向`，函数结果是`指向`.

-   如果要转换的表达式是类型为的格式良好的几何体`多点`包含一个`指向`，函数结果是`指向`。如果表达式包含多个`指向`一[`ER_无效_投射到_几何体`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型为的格式良好的几何体`混合数据类型`只包含一个`指向`，函数结果是`指向`。如果表达式为空，则包含多个`指向`，或包含其他几何图形类型[`ER_无效_投射到_几何体`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要强制转换的表达式是类型为`指向`, `多点`, `混合数据类型`一[`ER_无效_投射到_几何体`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

#### 转换为LineString的条件

当强制转换结果类型为`线绳`，这些条件适用：

-   如果要转换的表达式是类型为的格式良好的几何体`线绳`，函数结果是`线绳`.

-   如果要转换的表达式是类型为的格式良好的几何体`多边形`如果没有内环，函数结果是`线绳`以相同的顺序包含外圈的点。如果表达式有内环，则[`ER_无效_投射到_几何体`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型为的格式良好的几何体`多点`包含至少两个点的函数结果为`线绳`包含`多点`按它们在表达式中出现的顺序排列。如果表达式只包含一个`指向`一[`ER_无效_投射到_几何体`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型为的格式良好的几何体`线集合`包含一个`线绳`，函数结果是`线绳`.如果表达式包含多个`线串`， 一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型良好的几何`几何集合`, 只包含一个`线串`, 函数结果是`线串`.如果表达式为空，则包含多个`线串`，或包含其他几何类型，一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型正确的几何图形`线串`,`多边形`,`多点`,`多行字符串`， 要么`几何集合`， 一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

#### 投射到多边形的条件

当转换结果类型为`多边形`, 这些条件适用：

-   如果要转换的表达式是类型良好的几何`线串`即是一个环（即起点和终点相同），函数结果是一个`多边形`具有由点组成的外环`线串`以相同的顺序。如果表达式不是环，则[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。如果环的顺序不正确（外环必须是逆时针方向），则[`ER_INVALID_CAST_POLYGON_RING_DIRECTION`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_polygon_ring_direction)发生错误。

-   如果要转换的表达式是类型良好的几何`多边形`, 函数结果是`多边形`.

-   如果要转换的表达式是类型良好的几何`多行字符串`其中所有元素都是环，函数结果是`多边形`与第一个`线串`作为外圈和任何额外的`线串`值作为内圈。如果表达式的任何元素不是环，则[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。如果任何环的顺序不正确（外环必须逆时针，内环必须顺时针），[`ER_INVALID_CAST_POLYGON_RING_DIRECTION`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_polygon_ring_direction)发生错误。

-   如果要转换的表达式是类型良好的几何`多多边形`包含一个`多边形`, 函数结果是`多边形`.如果表达式包含多个`多边形`， 一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型良好的几何`几何集合`只包含一个`多边形`, 函数结果是`多边形`.如果表达式为空，则包含多个`多边形`，或包含其他几何类型，一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型正确的几何图形`线串`,`多边形`,`多行字符串`, `多多边形`， 要么`几何集合`， 一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

#### 投射到 MultiPoint 的条件

当转换结果类型为`多点`, 这些条件适用：

-   如果要转换的表达式是类型良好的几何`观点`, 函数结果是`多点`包含那个`观点`作为它的唯一元素。

-   如果要转换的表达式是类型良好的几何`线串`, 函数结果是`多点`包含的点`线串`以相同的顺序。

-   如果要转换的表达式是类型良好的几何`多点`, 函数结果是`多点`.

-   如果要转换的表达式是类型良好的几何`几何集合`只包含点，函数结果是`多点`包含这些点。如果`几何集合`为空或包含其他几何类型，[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型正确的几何图形`观点`,`线串`,`多点`， 要么`几何集合`， 一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

#### 强制转换为 MultiLineString 的条件

当转换结果类型为`多行字符串`, 这些条件适用：

-   如果要转换的表达式是类型良好的几何`线串`, 函数结果是`多行字符串`包含那个`线串`作为它的唯一元素。

-   如果要转换的表达式是类型良好的几何`多边形`, 函数结果是`多行字符串`包含的外环`多边形`作为它的第一个元素，任何内环作为附加元素，按照它们在表达式中出现的顺序。

-   如果要转换的表达式是类型良好的几何`多行字符串`, 函数结果是`多行字符串`.

-   如果要转换的表达式是类型良好的几何`多多边形`只包含没有内环的多边形，函数结果是`多行字符串`按照它们在表达式中出现的顺序包含多边形环。如果表达式包含任何带有内环的多边形，则[`ER_WRONG_PARAMETERS_TO_STORED_FCT`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_wrong_parameters_to_stored_fct)发生错误。

-   如果要转换的表达式是类型良好的几何`几何集合`仅包含线串，函数结果是`多行字符串`包含那些线串。如果表达式为空或包含其他几何类型，则[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型正确的几何图形`线串`,`多边形`,`多行字符串`,`多多边形`， 要么`几何集合`， 一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

#### 投射到 MultiPolygon 的条件

当转换结果类型为`多多边形`, 这些条件适用：

-   如果要转换的表达式是类型良好的几何`多边形`, 函数结果是`多多边形`包含`多边形`作为它的唯一元素。

-   如果要转换的表达式是类型良好的几何`多行字符串`其中所有元素都是环，函数结果是`多多边形`包含一个`多边形`表达式的每个元素只有一个外环。如果任何元素不是环，则[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。如果任何环的顺序不正确（外环必须逆时针），则[`ER_INVALID_CAST_POLYGON_RING_DIRECTION`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_polygon_ring_direction)发生错误。

-   如果要转换的表达式是类型良好的几何`多多边形`, 函数结果是`多多边形`.

-   如果要转换的表达式是类型良好的几何`几何集合`只包含多边形，函数结果是`多多边形`包含这些多边形。如果表达式为空或包含其他几何类型，则[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

-   如果要转换的表达式是类型正确的几何图形`多边形`,`多行字符串`,`多多边形`， 要么`几何集合`， 一个[`ER_INVALID_CAST_TO_GEOMETRY`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_cast_to_geometry)发生错误。

#### 转换为 GeometryCollection 的条件

当转换结果类型为`几何集合`, 这些条件适用：

-   `几何集合`和`几何收藏`是相同结果类型的同义词。

-   如果要转换的表达式是类型良好的几何`观点`, 函数结果是`几何集合`包含那个`观点`作为它的唯一元素。

-   如果要转换的表达式是类型良好的几何`线串`, 函数结果是`几何集合`包含那个`线串`作为它的唯一元素。

-   如果要转换的表达式是类型良好的几何`多边形`, 函数结果是`几何集合`包含那个`多边形`作为它的唯一元素。

-   如果要转换的表达式是类型良好的几何`多点`, 函数结果是`几何集合`按照它们在表达式中出现的顺序包含点。

-   如果要转换的表达式是类型良好的几何`多行字符串`, 函数结果是`几何集合`按照它们在表达式中出现的顺序包含线串。

-   如果要转换的表达式是类型良好的几何`多多边形`, 函数结果是`几何集合`包含的元素`多多边形`按照它们在表达式中出现的顺序。

-   如果要转换的表达式是类型良好的几何`几何集合`, 函数结果是`几何集合`.

### 铸造操作的其他用途

强制转换函数对于在 a 中创建具有特定类型的列很有用[`创建表...选择`](create-table.html)陈述：

```
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
```

强制转换函数对于排序很有用[`枚举`](enum.html)按词汇顺序排列的列。通常情况下，排序[`枚举`](enum.html)列使用内部数值出现。将值转换为[`字符`](char.html)导致词法排序：

```
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);
```

[`投掷（）`](cast-functions.html#function_cast)如果您将结果用作更复杂表达式的一部分，例如[`CONCAT('日期：',CAST(NOW() AS DATE))`](string-functions.html#function_concat).

对于时间值，几乎不需要使用[`投掷（）`](cast-functions.html#function_cast)提取不同格式的数据。相反，请使用诸如[`提炼（）`](date-and-time-functions.html#function_extract),[`日期格式（）`](date-and-time-functions.html#function_date-format)， 要么[`时间格式（）`](date-and-time-functions.html#function_time-format).看[第 12.7 节，“日期和时间函数”](date-and-time-functions.html).

要将字符串转换为数字，通常在数字上下文中使用字符串值就足够了：

```
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 节，“表达式求值中的类型转换”](type-conversion.html).

MySQL 支持有符号和无符号 64 位值的算术运算。对于数字运算符（例如[`+`](arithmetic-functions.html#operator_plus)要么[`-`](arithmetic-functions.html#operator_minus)) 如果其中一个操作数是无符号整数，则结果默认为无符号（参见[第 12.6.1 节，“算术运算符”](arithmetic-functions.html)）。要覆盖它，请使用`签`要么`未签名`cast 运算符将值分别转换为有符号或无符号 64 位整数。

```
mysql> SELECT 1 - 2;
        -> -1
mysql> SELECT CAST(1 - 2 AS UNSIGNED);
        -> 18446744073709551615
mysql> SELECT CAST(CAST(1 - 2 AS UNSIGNED) AS SIGNED);
        -> -1
```

如果任一操作数为浮点值，则结果为浮点值，不受前面规则的影响。（在这种情况下，[`十进制`](fixed-point-types.html)列值被视为浮点值。）

```
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;
        -> -1.0
```

SQL 模式会影响转换操作的结果（参见[第 5.1.11 节，“服务器 SQL 模式”](sql-mode.html)）。例子：

-   要将“零”日期字符串转换为日期，[`转变（）`](cast-functions.html#function_convert)和[`投掷（）`](cast-functions.html#function_cast)返回`空值`并产生警告时[`NO_ZERO_DATE`](sql-mode.html#sqlmode_no_zero_date)SQL 模式已启用。

-   对于整数减法，如果[`NO_UNSIGNED_SUBTRACTION`](sql-mode.html#sqlmode_no_unsigned_subtraction)启用 SQL 模式，即使任何操作数无符号，减法结果也有符号。
