> 技术文档 > MySQL 中的 CAST 函数详解_mysql cast

MySQL 中的 CAST 函数详解_mysql cast


MySQL 中的 CAST 函数详解

CAST 函数是 MySQL 中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型。

一、基本语法

CAST(expression AS type)

CONVERT(expression, type)

这两种语法功能相同,可以互换使用。

二、支持的数据类型

CAST 函数支持转换为以下数据类型:

  • BINARY[(N)] - 二进制字符串
  • CHAR[(N)] - 字符串,可指定长度
  • DATE - 日期
  • DATETIME - 日期时间
  • DECIMAL[(M[,D])] - 十进制数,可指定精度和小数位
  • SIGNED [INTEGER] - 有符号整数
  • UNSIGNED [INTEGER] - 无符号整数
  • TIME - 时间
  • JSON - JSON 格式 (MySQL 5.7.8+)

三、常见用法示例

1. 字符串转数字

SELECT CAST(\'123\' AS SIGNED); -- 转换为有符号整数,结果为 123SELECT CONVERT(\'45.67\', DECIMAL(5,2)); -- 转换为带2位小数的十进制数,结果为 45.67

2. 数字转字符串

SELECT CAST(123 AS CHAR); -- 转换为字符串,结果为 \'123\'SELECT CAST(123.45 AS CHAR(10)); -- 转换为长度为10的字符串,结果为 \'123.45\'

3. 日期时间转换

SELECT CAST(\'2023-08-20\' AS DATE); -- 转换为日期类型SELECT CAST(NOW() AS CHAR); -- 将当前日期时间转为字符串

4. 布尔值转换

SELECT CAST(1 AS UNSIGNED); -- 结果为 1SELECT CAST(0 AS SIGNED); -- 结果为 0

5. 二进制转换

SELECT CAST(\'MySQL\' AS BINARY); -- 转换为二进制字符串SELECT CAST(123 AS BINARY); -- 将数字转为二进制

四、特殊转换案例

1. 处理 NULL 值

SELECT CAST(NULL AS SIGNED); -- 结果为 NULL

2. 截断处理

SELECT CAST(\'123.456\' AS DECIMAL(5,2)); -- 结果为 123.46 (四舍五入)SELECT CAST(\'123.456\' AS DECIMAL(5,1)); -- 结果为 123.5 (四舍五入)

3. 转换失败处理

SELECT CAST(\'abc\' AS SIGNED); -- 结果为 0 (无法转换时返回0)SELECT CAST(\'2023-02-30\' AS DATE); -- 结果为 NULL (无效日期)

五、实际应用场景

1. 类型安全的比较

-- 避免字符串和数字的隐式转换SELECT * FROM products WHERE CAST(price AS CHAR) LIKE \'12%\';

2. 格式化输出

SELECT product_name, CONCAT(\'$\', CAST(price AS DECIMAL(10,2))) AS formatted_priceFROM products;

3. 数据迁移和清洗

-- 将字符串列转为数字进行计算UPDATE orders SET total = CAST(subtotal AS DECIMAL(10,2)) + CAST(tax AS DECIMAL(10,2));

4. 动态SQL处理

SET @str_value = \'123\';SELECT * FROM table WHERE id = CAST(@str_value AS SIGNED);

六、与 CONVERT 函数的区别

CAST 和 CONVERT 函数功能基本相同,但有细微差别:

  1. 语法不同:

    • CAST: CAST(expr AS type)
    • CONVERT: CONVERT(expr, type)CONVERT(expr USING charset)
  2. CONVERT 额外支持字符集转换:

    SELECT CONVERT(\'MySQL\' USING utf8mb4);

七、性能考虑

  1. 索引使用:对列使用 CAST 函数通常会导致索引失效

    -- 不推荐 (索引失效)SELECT * FROM users WHERE CAST(age AS CHAR) = \'25\';-- 推荐 (可以使用索引)SELECT * FROM users WHERE age = 25;
  2. 隐式转换:MySQL 会自动进行某些类型转换,但显式使用 CAST 更安全明确

  3. 精度损失:转换时要注意可能的精度损失或数据截断

八、与其他数据库的兼容性

  1. CAST 函数是 SQL 标准的一部分,在大多数数据库中都支持
  2. 语法基本相同,但支持的数据类型可能略有差异
  3. MySQL 的 CAST 在某些情况下比其他数据库更宽松(如字符串转数字)

CAST 函数是 MySQL 中处理数据类型转换的强大工具,合理使用可以确保数据的一致性和查询的正确性。在需要明确控制数据类型转换的场景下,CAST 函数是必不可少的。