# 12.11 转换函数和运算符

表 12.15 转换函数和运算符

姓名 描述 已弃用
二进制 将字符串转换为二进制字符串 8.0.27
投掷() 将值转换为特定类型
转变() 将值转换为特定类型

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

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

  • 二进制 表达式

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

    二进制从 MySQL 8.0.27 开始不推荐使用运算符,您应该期望在 MySQL 的未来版本中将其删除。采用演员(...作为二进制)反而。

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

    相比之下,二进制影响整个操作;它可以在任何一个操作数之前给出,结果相同。

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

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

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

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

    有关介绍人的信息,请参阅第 10.3.8 节,“字符集介绍器”.

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

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

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

    CHAR(10) CHARACTER SET binary
    BINARY(10)
    
    VARCHAR(10) CHARACTER SET binary
    VARBINARY(10)
    
    TEXT CHARACTER SET binary
    BLOB
    

    如果二进制从内部调用mysql客户端,二进制字符串使用十六进制表示法显示,具体取决于--binary-as-hex.有关该选项的更多信息,请参阅第 4.5.1 节,“mysql - MySQL 命令行客户端”.

  • 投掷(*表达式*作为*类型*[阵列])

    投下(*时间戳_值*在时区*时区_说明符*作为约会时间[(*精确*)])

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

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

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

    • 二进制的[(*N*)]

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

      有关如何进行强制转换的说明二进制的影响比较,请参见第11.3.3节,“二进制和变量二进制类型”.

    • 炭[(*N*)] [*charset_信息*]

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

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

      • 字符集*charset_名称*:生成具有给定字符集的字符串。

      • ASCII码:简写拉丁字符集1.

      • UNICODE:简写字符集ucs2.

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

    • 日期

      产生一个日期价值

    • 约会时间[(*M*)]

      产生一个约会时间价值如果可选*M*值,它指定了小数秒的精度。

    • 小数点[(*M*[,*D*])]

      产生一个十进制的价值如果可选*MD给定值时,它们指定最大位数(精度)和小数点后的位数(刻度)。如果D如果省略,则假定为0。如果M*省略,假设为10。

    • 双重的

      产生一个双重的后果在MySQL 8.0.17中添加。

    • 漂浮[(*p*)]

      如果精度*p未指定,则生成类型为的结果浮动如果p提供0\<=\<p\<=24,结果为类型浮动.如果25\<=p\<=53,结果为类型双重的如果p\<0或p* >53,返回一个错误。在MySQL 8.0.17中添加。

    • JSON

      产生一个JSON价值有关在之间转换值的规则的详细信息JSON以及其他类型,请参见JSON值的比较和排序.

    • 恩查尔[(*N*)]

      喜欢烧焦,但生成具有国家字符集的字符串。看见第10.3.7节,“民族性格集”.

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

    • 真实的

      生成类型的结果真实的.这实际上是浮动如果真正的_AS_FLOATSQL模式已启用;否则,结果就是类型双重的.

    • 有符号[整数]

      生成签名比金价值

    • 空间型

      从MySQL 8.0.24开始,演员阵容CONVERT()对于空间类型的某些组合,支持将几何图形值从一种空间类型转换为另一种空间类型。有关详细信息,请参阅对空间类型的强制转换操作.

    • 时间[(*M*)]

      产生一个时间价值如果可选*M*值,它指定了小数秒的精度。

    • 无符号[整数]

      生成一个未签名的比金价值

    • 产生一个价值在MySQL 8.0.22中添加。这些规则适用于转换为:

      • 对于1901-2155(含1901-2155)范围内的四位数字,或对于可解释为该范围内四位数字的字符串,返回相应的价值

      • 对于由一个或两个数字组成的数字,或者对于可以解释为这样一个数字的字符串,返回价值如下:

        • 如果数字在1-69(含1-69)之间,请加2000并返回总和。

        • 如果数字在70-99(含70-99)之间,则加1900并返回总和。

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

      • 对于数字0,返回0。

      • 暂时日期, 约会时间时间戳值,返回价值的一部分。暂时时间值,返回当前年份。

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

        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 |
        +--------------------------+-------------------------------+
        
      • 如果参数的类型为十进制的, 双重的, 十进制的真实的,将该值四舍五入为最接近的整数,然后尝试将该值强制转换为使用整数值规则,如下所示:

        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 |
        +---------------------+---------------------+
        
      • 类型的论点几何学无法转换为.

      • 对于无法成功转换为的值回来无效的.

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

        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允许使用额外的大堆用于在上创建多值索引的关键字JSON数组作为创建索引, 创建表格改变桌子声明。大堆不支持,除非用于在其中一条语句中创建多值索引,在这种情况下是必需的。要编制索引的列必须是类型为的列JSON具有大堆这个*类型*遵循关键字可以指定演员阵容,但二进制的, JSON。有关语法信息和示例以及其他相关信息,请参阅多值索引.

    笔记

    CONVERT()不像演员阵容支持多值索引创建或大堆关键词。

    从MySQL 8.0.22开始,演员阵容支持检索时间戳在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时区表(请参阅填充时区表).

    在时区不支持大堆关键字,并且不受CONVERT()作用

  • 皈依(*expr*使用*转码*)

    皈依(*expr*,*类型*)

    皈依(*expr*使用*转码*)是标准的SQL语法。非-使用形式CONVERT()是ODBC语法。

    皈依(*expr*使用*转码*)在不同的字符集之间转换数据。在MySQL中,转码名称与相应的字符集名称相同。例如,此语句转换字符串“abc”在默认字符集中设置为utf8mb4字符集:

    SELECT CONVERT('abc' USING utf8mb4);
    

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

    笔记

    在MySQL 8.0.28之前,此函数有时允许对二进制的非二进制字符集的值。什么时候CONVERT()被用作索引生成列的表达式的一部分,这可能会导致从以前版本的MySQL升级后索引损坏。看见SQL更改,以获取有关如何处理这种情况的信息。

# 字符集转换

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*, *类型*)语法(没有使用),或投下(*expr*作为*类型*),相当于:

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_名称*,结果的字符集和排序规则由字符集连接校对连接确定默认连接字符集和排序规则的系统变量(请参阅第10.4节,“连接字符集和排序规则”).

A.整理条款不允许在CONVERT()演员阵容调用,但可以将其应用于函数结果。例如,这些是合法的:

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在前面的例子中是介绍人的例子。与转换函数不同,例如演员阵容CONVERT(),将字符串从一个字符集转换为另一个字符集,介绍人将字符串文字指定为具有特定的字符集,而不涉及转换。有关更多信息,请参阅第10.3.8节,“字符集介绍人”.

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

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

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

要为转换后的字符串指定特定的排序规则,请使用整理下列条款CONVERT()电话:

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

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

CONVERT()演员阵容可以更普遍地用于比较不同字符集中表示的字符串。例如,比较这些字符串会导致错误,因为它们具有不同的字符集:

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

字符集转换在二进制字符串的字母表壳转换之前也很有用。下()上()当直接应用于二进制字符串时无效,因为字母大小写的概念不适用。要执行二进制字符串的字母大小写转换,请首先使用适合存储在字符串中的数据的字符集将其转换为非二进制字符串:

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

请注意,如果你申请二进制的, 演员阵容CONVERT()对于索引列,MySQL可能无法有效地使用索引。

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

从MySQL 8.0.24开始,演员阵容CONVERT()对于空间类型的某些组合,支持将几何图形值从一种空间类型转换为另一种空间类型。下面的列表显示了允许的类型组合,其中“MySQL扩展”指定在MySQL中实现的类型转换,而不是在SQL/MM标准:

# 空间投射的一般条件

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

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

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

  • 如果要使用的表达式是无效的,函数结果为无效的.

  • 使用JSON_值()具有返回不允许使用指定空间类型的子句。

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

  • 如果允许空间类型组合,但要转换的表达式不是语法良好的几何体,则ER_GIS_无效_数据 (opens new window)发生错误。

  • 如果允许空间类型组合,但要转换的表达式是未定义空间参考系(SRS)中语法良好的几何体,则ER_SRS_未找到 (opens new window)发生错误。

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

# 强制转换到点的条件

当强制转换结果类型为指向,这些条件适用:

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

  • 如果要转换的表达式是类型为的格式良好的几何体多点包含一个指向,函数结果是指向。如果表达式包含多个指向ER_无效_投射到_几何体 (opens new window)发生错误。

  • 如果要转换的表达式是类型为的格式良好的几何体混合数据类型只包含一个指向,函数结果是指向。如果表达式为空,则包含多个指向,或包含其他几何图形类型ER_无效_投射到_几何体 (opens new window)发生错误。

  • 如果要强制转换的表达式是类型为指向, 多点, 混合数据类型ER_无效_投射到_几何体 (opens new window)发生错误。

# 转换为LineString的条件

当强制转换结果类型为线绳,这些条件适用:

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

  • 如果要转换的表达式是类型为的格式良好的几何体多边形如果没有内环,函数结果是线绳以相同的顺序包含外圈的点。如果表达式有内环,则ER_无效_投射到_几何体 (opens new window)发生错误。

  • 如果要转换的表达式是类型为的格式良好的几何体多点包含至少两个点的函数结果为线绳包含多点按它们在表达式中出现的顺序排列。如果表达式只包含一个指向ER_无效_投射到_几何体 (opens new window)发生错误。

  • 如果要转换的表达式是类型为的格式良好的几何体线集合包含一个线绳,函数结果是线绳.如果表达式包含多个线串, 一个ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

  • 如果要转换的表达式是类型良好的几何几何集合, 只包含一个线串, 函数结果是线串.如果表达式为空,则包含多个线串,或包含其他几何类型,一个ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

  • 如果要转换的表达式是类型正确的几何图形线串,多边形,多点,多行字符串, 要么几何集合, 一个ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

# 投射到多边形的条件

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

# 投射到 MultiPoint 的条件

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

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

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

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

  • 如果要转换的表达式是类型良好的几何几何集合只包含点,函数结果是多点包含这些点。如果几何集合为空或包含其他几何类型,ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

  • 如果要转换的表达式是类型正确的几何图形观点,线串,多点, 要么几何集合, 一个ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

# 强制转换为 MultiLineString 的条件

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

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

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

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

  • 如果要转换的表达式是类型良好的几何多多边形只包含没有内环的多边形,函数结果是多行字符串按照它们在表达式中出现的顺序包含多边形环。如果表达式包含任何带有内环的多边形,则ER_WRONG_PARAMETERS_TO_STORED_FCT (opens new window)发生错误。

  • 如果要转换的表达式是类型良好的几何几何集合仅包含线串,函数结果是多行字符串包含那些线串。如果表达式为空或包含其他几何类型,则ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

  • 如果要转换的表达式是类型正确的几何图形线串,多边形,多行字符串,多多边形, 要么几何集合, 一个ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

# 投射到 MultiPolygon 的条件

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

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

  • 如果要转换的表达式是类型良好的几何多行字符串其中所有元素都是环,函数结果是多多边形包含一个多边形表达式的每个元素只有一个外环。如果任何元素不是环,则ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。如果任何环的顺序不正确(外环必须逆时针),则ER_INVALID_CAST_POLYGON_RING_DIRECTION (opens new window)发生错误。

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

  • 如果要转换的表达式是类型良好的几何几何集合只包含多边形,函数结果是多多边形包含这些多边形。如果表达式为空或包含其他几何类型,则ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

  • 如果要转换的表达式是类型正确的几何图形多边形,多行字符串,多多边形, 要么几何集合, 一个ER_INVALID_CAST_TO_GEOMETRY (opens new window)发生错误。

# 转换为 GeometryCollection 的条件

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

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

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

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

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

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

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

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

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

# 铸造操作的其他用途

强制转换函数对于在 a 中创建具有特定类型的列很有用创建表...选择陈述:

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

强制转换函数对于排序很有用枚举按词汇顺序排列的列。通常情况下,排序枚举列使用内部数值出现。将值转换为字符导致词法排序:

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

投掷()如果您将结果用作更复杂表达式的一部分,例如CONCAT('日期:',CAST(NOW() AS DATE)).

对于时间值,几乎不需要使用投掷()提取不同格式的数据。相反,请使用诸如提炼(),日期格式(), 要么时间格式().看第 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 节,“算术运算符”)。要覆盖它,请使用要么未签名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

如果任一操作数为浮点值,则结果为浮点值,不受前面规则的影响。(在这种情况下,十进制列值被视为浮点值。)

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

SQL 模式会影响转换操作的结果(参见第 5.1.11 节,“服务器 SQL 模式”)。例子: