MySQL CONVERT() 函数使用指南

MySQL CONVERT() 函数将任意类型的参数值转为指定的类型或者字符集。

CONVERT() 语法

这里是 MySQL CONVERT() 函数的语法:

CONVERT(expr, data_type)

CONVERT(expr USING charset)

CONVERT(expr, data_type) 等同于 CAST(expr AS data_type)

参数

  • expr

    必需的。 一个需要转换数据类型的值。

  • data_type

    必需的。 目标数据类型。您可以使用下面的类型:

    • BINARY[(N)]: 如果参数为空(0 长度),结果是 BINARY(0),否则结果是 VARBINARY 类型的字符串。

    • CHAR[(N)]: 结果是 VARCHAR 类型的字符串。除非参数为空,结果是 CHAR(0)

    • DATE: 结果是 DATE 类型的。

    • DATETIME[(M)]: 结果是 DATETIME 类型的,M 是小数秒的位数。

    • DECIMAL[(M[,D])]: 结果是 DECIMAL 类型的。

    • DOUBLE: 结果是 DOUBLE 类型的。它在 MySQL 8.0.17 添加。

    • FLOAT[(p)]: 按如下规则转换数据类型

      • 如果没有指定 p,结果是 FLOAT 类型的。
      • 如果 0 <= p <= 24,结果是 FLOAT 类型的。
      • 如果 25 <= p <= 53,结果是 DOUBLE 类型的。
      • 如果 p < 0p > 53,返回一个错误。
    • JSON: 结果是 JSON 类型的。

    • NCHAR[(N)]: 结果是 NCHAR 类型的。

    • REAL: 结果是 REAL 类型的。实际上,如果启用了 REAL_AS_FLOAT 它是 FLOAT,否则是 DOUBLE

    • SIGNED [INTEGER]: 结果是一个有符号的 BIGINT 类型。

    • TIME[(M)]: 结果是 TIME 类型的,M 是小数秒的位数。

    • UNSIGNED [INTEGER]: 结果是一个无符号的 BIGINT 类型。

    • YEAR: 结果是 YEAR 类型的,它在 MySQL 8.0.22 添加。

  • charset

    必需的。 要转换为的字符集。

返回值

MySQL CONVERT() 函数将任意类型的参数值转为指定的类型或者字符集并返回。

CONVERT() 示例

这里有几个 CONVERT() 的常用示例。

转为二进制

您可以是用 CONVERT() 函数将一个字符串转为二进制字符串。

SELECT CONVERT('hello', BINARY);
+----------------------------------------------------+
| CONVERT('hello', BINARY)                           |
+----------------------------------------------------+
| 0x68656C6C6F                                       |
+----------------------------------------------------+

注意, 在 mysql client 中,二进制字符串默认以十六进制的形式打印出来。

您也可以使用 BINARY 操作符获取一个字符串的二进制字符串。如下:

SELECT BINARY 'hello';
+--------------------------------+
| BINARY 'hello'                 |
+--------------------------------+
| 0x68656C6C6F                   |
+--------------------------------+

转为 JSON

您可以使用 CONVERT() 函数将使用字符串表示的 JSON 文档转为 JSON 类型的数据。

SELECT CONVERT('[1, 2, "a"]', JSON);
+------------------------------+
| CONVERT('[1, 2, "a"]', JSON) |
+------------------------------+
| [1, 2, "a"]                  |
+------------------------------+

转为日期时间

您可以使用 CONVERT() 函数将使用字符串表示的日期/时间值转为 DATE, DATETIME 类型的数据。

SELECT
    CONVERT('2022-02-28', DATE),
    CONVERT('10:10:10', TIME),
    CONVERT('2022-02-28 10:10:10', DATETIME);
+-----------------------------+---------------------------+------------------------------------------+
| CONVERT('2022-02-28', DATE) | CONVERT('10:10:10', TIME) | CONVERT('2022-02-28 10:10:10', DATETIME) |
+-----------------------------+---------------------------+------------------------------------------+
| 2022-02-28                  | 10:10:10                  | 2022-02-28 10:10:10                      |
+-----------------------------+---------------------------+------------------------------------------+

转换字符集

本示例将 Hello 的字符集改为 latin1 字符集:

SELECT CONVERT("Hello" USING latin1);
+-------------------------------+
| CONVERT("Hello" USING latin1) |
+-------------------------------+
| Hello                         |
+-------------------------------+

如果采用的字符集不能表示相应的字符串,则会出现乱码。比如:

SELECT
    CONVERT("好" USING latin1),
    CONVERT("好" USING utf8mb4);
+-----------------------------+------------------------------+
| CONVERT("好" USING latin1)  | CONVERT("好" USING utf8mb4)  |
+-----------------------------+------------------------------+
| ?                           | 好                           |
+-----------------------------+------------------------------+

这里,由于这个字符 超出了 latin1 的范围,因此输出了乱码。而转为 utf8mb4 则正常输出。