转换函数和运算符可以将值从一种数据类型转换为另一种数据类型。
BINARY
expr
运算符将
BINARY
表达式转换为二进制字符串(具有binary
字符集和binary
排序规则的字符串)。for 的一个常见用途BINARY
是强制使用数字字节值而不是逐个字符地逐字节进行字符串比较。BINARY
运算符还会导致比较中的尾随空格很重要。 有关字符集排序规则与非二进制字符集排序规则之间差异的信息 ,binary
请 参阅第 10.8.5 节,“二进制排序规则与 _bin 排序规则的比较”。binary
_bin
该
BINARY
运算符从 MySQL 8.0.27 开始被弃用,您应该期望在未来版本的 MySQL 中将其删除。改用CAST(... AS BINARY)
。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
排序规则。例如,如果表默认字符集是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
. 有关该选项的更多信息,请参阅 第 4.5.1 节,“mysql — MySQL 命令行客户端”。CAST(
timestamp_value
AT TIME ZONEtimezone_specifier
AS DATETIME[(precision
)])timezone_specifier
: [INTERVAL] '+00:00' | '世界标准时间'使用 语法, 函数采用任何类型的表达式并生成指定类型的结果值。这个操作也可以表示为 ,是等价的。如果是 ,则返回 。
CAST(
expr
AStype
CAST()
CONVERT(
expr
,type
)expr
NULL
CAST()
NULL
这些
type
值是允许的:BINARY[(
N
)]生成
VARBINARY
数据类型为 string 的字符串,但当表达式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
,则 导致强制转换使用不超过 参数的字符。对于比字符短的值,不会进行填充 。如果未给出可选长度,MySQL 将根据表达式计算最大长度。如果提供或计算的长度大于内部阈值,则结果类型为CHAR(
N
)N
N
N
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
结果。在 MySQL 8.0.17 中添加。FLOAT[(
p
)]如果未指定精度
p
,则生成 type 的结果FLOAT
。如果p
提供且 0 <= <p
<= 24,则结果的类型为FLOAT
. 如果 25 <=p
<= 53,则结果的类型为DOUBLE
。如果p
< 0 或p
> 53,则返回错误。在 MySQL 8.0.17 中添加。JSON
产生一个
JSON
值。有关值JSON
与其他类型之间的值转换规则的详细信息,请参阅JSON 值的比较和排序。NCHAR[(
N
)]与 类似
CHAR
,但会生成具有国家字符集的字符串。请参阅 第 10.3.7 节,“国家字符集”。与 不同
CHAR
,NCHAR
不允许指定尾随字符集信息。REAL
产生类型的结果
REAL
。这实际上是FLOAT
如果REAL_AS_FLOAT
启用了 SQL 模式;否则结果是类型DOUBLE
。SIGNED [INTEGER]
产生一个带符号的
BIGINT
值。spatial_type
从 MySQL 8.0.24 开始,
CAST()
支持CONVERT()
将几何值从一种空间类型转换为另一种空间类型的某些组合。有关详细信息,请参阅 空间类型的转换操作。TIME[(
M
)]产生一个
TIME
值。如果给出可选M
值,则它指定小数秒精度。UNSIGNED [INTEGER]
产生一个无符号
BIGINT
值。YEAR
产生一个
YEAR
值。在 MySQL 8.0.22 中添加。这些规则控制转换为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 | +---------------------+---------------------+
对于无法成功转换为 的值
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' | +---------+------+-------------------------------------------+
在 MySQL 8.0.17 及更高版本中,
InnoDB
允许使用附加ARRAY
关键字在数组上创建多值索引JSON
作为CREATE INDEX
、CREATE TABLE
和ALTER TABLE
语句的一部分。ARRAY
不支持,除非用于在这些语句之一中创建多值索引,在这种情况下它是必需的。被索引的列必须是 类型的列JSON
。对于ARRAY
,type
以下AS
关键字可以指定 支持的任何类型CAST()
,但BINARY
、JSON
和YEAR
. 有关语法信息和示例以及其他相关信息,请参阅 多值索引。从 MySQL 8.0.22 开始,
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()
,并且服务器引发诸如Unknown or incorrect time zone: 'UTC' 之类的错误,您可能需要安装 MySQL 时区表(请参阅 填充时区表)。AT TIME ZONE
不支持ARRAY
关键字,且不受CONVERT()
函数支持。CONVERT(
expr
USINGtranscoding_name
)CONVERT(
是标准的 SQL 语法。的非expr
USINGtranscoding_name
)USING
形式CONVERT()
是 ODBC 语法。无论使用何种语法,函数都会返回NULL
ifexpr
isNULL
。CONVERT(
在不同字符集之间转换数据。在MySQL中,转码名称与对应的字符集名称相同。例如,此语句将expr
USINGtranscoding_name
)'abc'
默认字符集中的字符串转换为字符集中对应的字符串utf8mb4
:SELECT CONVERT('abc' USING utf8mb4);
CONVERT(
syntax (withoutexpr
,type
)USING
) 采用表达式和type
指定结果类型的值,并生成指定类型的结果值。这个操作也可以表示为 ,是等价的。有关详细信息,请参阅 的说明 。CAST(
expr
AStype
)CAST()
笔记在 MySQL 8.0.28 之前,此函数有时允许将
BINARY
值无效转换为非二进制字符集。当CONVERT()
用作索引生成列的表达式的一部分时,这可能会导致从以前版本的 MySQL 升级后索引损坏。有关如何处理这种情况的信息, 请参阅 SQL Changes 。
CONVERT()
with
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);
如果您像刚才显示的那样指定,则结果的字符集和排序规则是
默认排序规则。如果省略,则结果的字符集和排序
规则由确定默认连接字符集和排序规则的和
系统变量定义(请参阅第 10.4 节,“连接字符集和排序规则”)。
CHARACTER SET
charset_name
charset_name
charset_name
CHARACTER SET
charset_name
character_set_connection
collation_connection
或
调用中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()
等将字符串从一种字符集转换为另一种字符集的转换函数不同,引入符将字符串文字指定为具有特定字符集,不涉及转换。有关详细信息,请参阅
第 10.3.8 节,“字符集介绍人”。
通常,您不能以
BLOB
不区分大小写的方式比较值或其他二进制字符串,因为二进制字符串使用的
binary
字符集与字母大小写的概念没有排序规则。要执行不区分大小写的比较,首先使用
CONVERT()
or
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 |
+-------------+------------------------------------+
从 MySQL 8.0.24 开始,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
是同一结果类型的同义词。
某些条件适用于所有空间类型转换,而某些条件仅在转换结果具有特定空间类型时适用。有关 “良构几何”等术语的信息,请参阅 第 11.4.4 节,“几何的良构性和有效性”。
空间投射的一般条件
这些条件适用于所有空间投射,无论结果类型如何:
强制转换的结果与要强制转换的表达式位于同一个 SRS 中。
空间类型之间的转换不会改变坐标值或顺序。
如果要转换的表达式是
NULL
,则函数结果是NULL
。不允许 使用
JSON_VALUE()
带有指定空间类型的子句的函数 转换为空间类型 。RETURNING
ARRAY
不允许转换为空间类型 。如果允许空间类型组合但要转换的表达式不是语法上格式正确的几何图形,
ER_GIS_INVALID_DATA
则会发生错误。如果允许空间类型组合,但要转换的表达式是未定义空间参考系统 (SRS) 中语法上格式正确的几何图形,
ER_SRS_NOT_FOUND
则会发生错误。如果要转换的表达式具有地理 SRS 但经度或纬度超出范围,则会发生错误:
如果经度值不在 (−180, 180] 范围内,
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
则会发生错误。如果纬度值不在 [−90, 90] 范围内,
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
则会发生错误。
显示的范围以度为单位。如果 SRS 使用另一个单位,则范围使用其单位中的相应值。由于浮点运算,确切的范围限制略有偏差。
投射到点的条件
当转换结果类型为Point
时,以下条件适用:
如果要转换的表达式是类型为 的格式正确的几何
Point
,则函数结果为Point
。如果要转换的表达式是
MultiPoint
包含单个 的格式正确的几何类型Point
,则函数结果为Point
。如果表达式包含多个Point
,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果要转换的表达式是
GeometryCollection
仅包含单个的格式正确的几何类型Point
,则函数结果为Point
。如果表达式为空、包含多个Point
或包含其他几何类型,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果要转换的表达式是
Point
,MultiPoint
, 以外类型的格式正确的几何GeometryCollection
,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。
转换为 LineString 的条件
当转换结果类型为LineString
时,以下条件适用:
如果要转换的表达式是类型为 的格式正确的几何
LineString
,则函数结果为LineString
。如果要转换的表达式是
Polygon
没有内环的格式正确的几何类型,则函数结果是LineString
包含外环点的相同顺序的。如果表达式有内环,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果要转换的表达式是一个格式正确的几何类型, 其类型
MultiPoint
至少包含两个点,则函数结果是LineString
包含MultiPoint
按它们在表达式中出现的顺序排列的点。如果表达式仅包含一个Point
,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果要转换的表达式是
MultiLineString
包含单个 的格式正确的几何类型LineString
,则函数结果为LineString
。如果表达式包含多个LineString
,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果要转换的表达式是格式正确的几何类型
GeometryCollection
,仅包含一个LineString
,则函数结果为LineString
。如果表达式为空、包含多个LineString
或包含其他几何类型,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。LineString
如果要转换的表达式是,Polygon
,MultiPoint
,MultiLineString
, 或 以外类型的格式正确的几何,GeometryCollection
则会ER_INVALID_CAST_TO_GEOMETRY
发生错误。
转换为多边形的条件
当转换结果类型为Polygon
时,以下条件适用:
如果要转换的表达式是一个格式正确
LineString
的环类型几何(即起点和终点相同),则函数结果为 aPolygon
外环由LineString
相同顺序的点组成. 如果表达式不是环,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果环的顺序不正确(外环必须逆时针),ER_INVALID_CAST_POLYGON_RING_DIRECTION
就会发生错误。如果要转换的表达式是类型为 的格式正确的几何
Polygon
,则函数结果为Polygon
。如果要转换的表达式是一个格式正确的几何类型
MultiLineString
,其中所有元素都是环,则函数结果是 aPolygon
,第一个LineString
作为外环,任何其他LineString
值作为内环。如果表达式的任何元素不是环,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果任何环的顺序不正确(外环必须逆时针,内环必须顺时针),ER_INVALID_CAST_POLYGON_RING_DIRECTION
就会发生错误。如果要转换的表达式是
MultiPolygon
包含单个 的格式正确的几何类型Polygon
,则函数结果为Polygon
。如果表达式包含多个Polygon
,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果要转换的表达式是
GeometryCollection
仅包含单个的格式正确的几何类型Polygon
,则函数结果为Polygon
。如果表达式为空、包含多个Polygon
或包含其他几何类型,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。LineString
如果要转换的表达式是,Polygon
,MultiLineString
,MultiPolygon
, 或 以外类型的格式正确的几何,GeometryCollection
则会ER_INVALID_CAST_TO_GEOMETRY
发生错误。
投射到 MultiPoint 的条件
当转换结果类型为MultiPoint
时,以下条件适用:
如果要转换的表达式是 type 的格式正确的几何图形
Point
,则函数结果是MultiPoint
包含它Point
作为其唯一元素的 。如果要转换的表达式是类型为 的格式正确的几何图形
LineString
,则函数结果是MultiPoint
包含LineString
相同顺序的点的 。如果要转换的表达式是类型为 的格式正确的几何
MultiPoint
,则函数结果为MultiPoint
。如果要转换的表达式是
GeometryCollection
仅包含点的格式正确的几何类型,则函数结果是MultiPoint
包含这些点的 。如果GeometryCollection
为空或包含其他几何类型,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。Point
如果要转换的表达式是、LineString
、MultiPoint
或 以外类型的格式正确的几何,GeometryCollection
则会ER_INVALID_CAST_TO_GEOMETRY
发生错误。
转换为 MultiLineString 的条件
当转换结果类型为MultiLineString
时,以下条件适用:
如果要转换的表达式是 type 的格式正确的几何图形
LineString
,则函数结果是MultiLineString
包含它LineString
作为其唯一元素的 。如果要转换的表达式是一个格式正确的几何类型
Polygon
,则函数结果是一个MultiLineString
包含的外环Polygon
作为其第一个元素,任何内环作为附加元素,按照它们在表达式中出现的顺序。如果要转换的表达式是类型为 的格式正确的几何
MultiLineString
,则函数结果为MultiLineString
。如果要转换的表达式是一个格式正确的几何类型, 其类型
MultiPolygon
只包含没有内环的多边形,则函数结果是MultiLineString
包含多边形环,它们按照它们在表达式中出现的顺序排列。如果表达式包含任何带内环的多边形,ER_WRONG_PARAMETERS_TO_STORED_FCT
则会发生错误。如果要转换的表达式是
GeometryCollection
仅包含线串的格式正确的几何类型,则函数结果为MultiLineString
包含这些线串的 。如果表达式为空或包含其他几何类型,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。LineString
如果要转换的表达式是,Polygon
,MultiLineString
,MultiPolygon
, 或 以外类型的格式正确的几何,GeometryCollection
则会ER_INVALID_CAST_TO_GEOMETRY
发生错误。
转换为 MultiPolygon 的条件
当转换结果类型为MultiPolygon
时,以下条件适用:
如果要转换的表达式是一个格式正确的几何类型
Polygon
,则函数结果是一个MultiPolygon
包含Polygon
作为其唯一元素的。如果要转换的表达式是一个格式正确的几何类型
MultiLineString
,其中所有元素都是环,则函数结果是一个MultiPolygon
包含 aPolygon
的表达式的每个元素只有一个外环。如果任何元素不是环,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。如果任何环的顺序不正确(外环必须逆时针旋转),ER_INVALID_CAST_POLYGON_RING_DIRECTION
就会发生错误。如果要转换的表达式是类型为 的格式正确的几何
MultiPolygon
,则函数结果为MultiPolygon
。如果要转换的表达式是
GeometryCollection
仅包含多边形的格式正确的几何类型,则函数结果是MultiPolygon
包含这些多边形的 。如果表达式为空或包含其他几何类型,ER_INVALID_CAST_TO_GEOMETRY
则会发生错误。Polygon
如果要转换的表达式是、MultiLineString
、MultiPolygon
或 以外类型的格式正确的几何,GeometryCollection
则会ER_INVALID_CAST_TO_GEOMETRY
发生错误。
转换为 GeometryCollection 的条件
当转换结果类型为
GeometryCollection
时,以下条件适用:
GeometryCollection
并且GeomCollection
是相同结果类型的同义词。如果要转换的表达式是 type 的格式正确的几何图形
Point
,则函数结果是GeometryCollection
包含它Point
作为其唯一元素的 。如果要转换的表达式是 type 的格式正确的几何图形
LineString
,则函数结果是GeometryCollection
包含它LineString
作为其唯一元素的 。如果要转换的表达式是 type 的格式正确的几何图形
Polygon
,则函数结果是GeometryCollection
包含它Polygon
作为其唯一元素的 。如果要转换的表达式是类型为 的格式正确的几何图形
MultiPoint
,则函数结果是GeometryCollection
包含按它们在表达式中出现的顺序排列的点。如果要转换的表达式是 type 的格式正确的几何图形
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
强制转换函数对于按
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 位值的算术。对于其中一个操作数是无符号整数的数字运算符(例如
+
or
),默认情况下结果是无符号的(请参阅第 12.6.1 节,“算术运算符”)。要覆盖它,请使用or
cast 运算符分别将值转换为有符号或无符号的 64 位整数。
-
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.11 节,“服务器 SQL 模式”)。例子:
用于将“零”日期字符串转换为日期,
CONVERT()
并 在启用 SQL 模式 时CAST()
返回NULL
并产生警告 。NO_ZERO_DATE
对于整数减法,如果
NO_UNSIGNED_SUBTRACTION
启用了SQL模式,即使任何操作数是无符号的,减法结果也是有符号的。