CAST() 和 CONVERT()新增目标类型

功能描述

数据类型转换函数

CAST()CONVERT()现在支持转换到类型 DOUBLEFLOATREAL。在MySQL 8.0.17中添加。请参见第12.10节”Cast Functions and Operators”

功能学习

名称 描述
CAST() 将值强制转换为特定类型
CONVERT() 将值强制转换为特定类型
select convert('abc', float);
select cast('abc' as float);

select convert(1, double);
select cast(1 as double);

FLOAT和DOUBLE类型代表近似数字数据值。MySQL对单精度值使用四个字节,对双精度值使用八个字节。

  • 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中添加。

CONVERT的用法

  1. CONVERT(e) 一个参数,使用一个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;
  2. CONVERT(s, c) 两个参数,语法:

    CONVERT(string, CHAR[(N)] CHARACTER SET charset_name)

    例如:

    SELECT CONVERT('test', CHAR CHARACTER SET utf8mb4);

    注意,如果要额外指定转换非默认的字符排序规则时,语法为: SELECT CONVERT() COLLATE utf8mb4_bin;

习题1

比较以不同字符集表示的字符串,_latin1 'abc'_latin2 'abc'

SET @s1 = _latin1 'abc', @s2 = _latin2 'abc';
select @s1=@s2;
select @s1=convert(@s2 using latin1);
select @s1=convert(@s2, char character set latin1);

结果:

mysql> SET @s1 = _latin1 'abc', @s2 = _latin2 'abc';
Query OK, 0 rows affected (0.00 sec)

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 |
+-------------------------------+
1 row in set (0.00 sec)

mysql> select @s1=convert(@s2, char character set latin1);
+---------------------------------------------+
| @s1=convert(@s2, char character set latin1) |
+---------------------------------------------+
| 1 |
+---------------------------------------------+
1 row in set (0.00 sec)
习题2

转换为日期类型
强制转换功能对于在CREATE TABLE ... SELECT语句中创建具有特定类型的列很有用

mysql> SELECT CAST('2000/01/01' AS DATE);
+----------------------------+
| CAST('2000/01/01' AS DATE) |
+----------------------------+
| 2000-01-01 |
+----------------------------+
1 row in set (0.00 sec)
习题3

对ENUM的列进行排序

强制转换功能对于按ENUM词汇顺序对列进行排序很有用。通常,ENUM使用内部数值对列进行排序。将值强制转换 CHAR为词法排序:

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

CAST用法

CAST() 是标准的SQL语法。

CAST(expr AS type [ARRAY])

例如:

CAST(string AS CHAR[(N)] CHARACTER SET charset_name)
SELECT CAST('test' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin;

Type的类型

CONVERT()不带, USINGCAST()使用一个表达式和一个 type值指定结果类型。这些type值是允许的:

  • BINARY[(*N*)]

    产生具有BINARY数据类型的字符串 。有关如何影响比较的描述,请参见 第11.3.3节“ BINARY和VARBINARY类型”。如果N给出了可选的长度 ,则 导致强制类型转换使用不超过 参数字节的字节数。小于字节的值用字节填充,长度为 。 BINARY(*N*)N**N0x00N

  • CHAR[(*N*)] [*charset_info*]

    产生具有CHAR数据类型的字符串 。如果N给出了可选的长度,则 导致强制类型转换最多使用 参数的字符。小于字符的值不会出现填充 。 CHAR(*N*)N**N

    如果没有charset_info子句,则 CHAR生成具有默认字符集的字符串。要明确指定字符集,可以使用以下charset_info值:

    • CHARACTER SET *charset_name*:产生具有给定字符集的字符串。
    • ASCII:的简写 CHARACTER SET latin1
    • UNICODE:的简写 CHARACTER SET ucs2

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

  • DATE

    产生一个DATE值。

  • DATETIME

    产生一个DATETIME值。

  • DECIMAL[(*M*[,*D*])]

    产生一个DECIMAL值。如果给出了可选MD值,则它们指定最大位数(精度)和小数点后的位数(小数位数)。

  • 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节“国家字符集”

    与不同CHARNCHAR 不允许指定结尾字符集信息。

  • REAL

    产生type的结果 REAL。这实际上是 FLOAT,如果 REAL_AS_FLOAT启用了SQL模式; 否则结果为类型 DOUBLE

  • SIGNED [INTEGER]

    产生一个有符号的整数值。

  • TIME

    产生一个TIME值。

  • UNSIGNED [INTEGER]

    产生一个无符号整数值。