# 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*])]
产生一个
十进制的
价值如果可选*M
和D
给定值时,它们指定最大位数(精度)和小数点后的位数(刻度)。如果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_FLOAT
SQL模式已启用;否则,结果就是类型双重的
.有符号[整数]
生成签名
比金
价值空间型
从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*使用*
转码*)
是标准的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标准:
从…起
指向
致:多点
混合数据类型
从…起
线绳
致:多边形
(MySQL扩展)多点
(MySQL扩展)线集合
混合数据类型
从…起
多边形
致:线绳
(MySQL扩展)线集合
(MySQL扩展)多面
混合数据类型
从…起
多点
致:指向
线绳
(MySQL扩展)混合数据类型
从…起
线集合
致:线绳
多边形
(MySQL扩展)多面
(MySQL扩展)混合数据类型
从…起
多面
致:多边形
线集合
(MySQL扩展)混合数据类型
从…起
混合数据类型
致:指向
线绳
多边形
多点
线集合
多面
在空间投射中,
混合数据类型
和GeomCollection
是同一结果类型的同义词。有些条件适用于所有空间类型强制转换,有些条件仅在强制转换结果为具有特定空间类型时适用。有关“格式良好的几何体”等术语的信息,请参见第11.4.4节,“几何良好形式和有效性”.
# 空间投射的一般条件
无论结果类型如何,这些条件都适用于所有空间强制转换:
强制转换的结果与要强制转换的表达式的结果在相同的SRS中。
在空间类型之间转换不会更改坐标值或顺序。
如果要使用的表达式是
无效的
,函数结果为无效的
.使用
JSON_值()
具有返回
不允许使用指定空间类型的子句。投球
大堆
不允许使用空间类型。如果允许空间类型组合,但要转换的表达式不是语法良好的几何体,则
ER_GIS_无效_数据
(opens new window)发生错误。如果允许空间类型组合,但要转换的表达式是未定义空间参考系(SRS)中语法良好的几何体,则
ER_SRS_未找到
(opens new window)发生错误。如果要强制转换的表达式具有地理SRS,但其经度或纬度超出范围,则会发生错误:
如果经度值不在范围内(−180,180],一个
几何参数经度超出范围
(opens new window)发生错误。如果纬度值不在范围内[−90, 90]一
几何参数纬度超出范围
(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)发生错误。
# 投射到多边形的条件
当转换结果类型为多边形
, 这些条件适用:
如果要转换的表达式是类型良好的几何
线串
即是一个环(即起点和终点相同),函数结果是一个多边形
具有由点组成的外环线串
以相同的顺序。如果表达式不是环,则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_POLYGON_RING_DIRECTION
(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 模式”)。例子:
要将“零”日期字符串转换为日期,
转变()
和投掷()
返回空值
并产生警告时NO_ZERO_DATE
SQL 模式已启用。对于整数减法,如果
NO_UNSIGNED_SUBTRACTION
启用 SQL 模式,即使任何操作数无符号,减法结果也有符号。