MySQL CAST 如何处理溢出?
MySQL提供了CAST函数将一个数据类型强制转换成为另外一个数据类型。然而,假如我们将一个超出目标数据类型范围的值转换为该数据类型,会发生什么呢?
1. CAST 转换类型
CAST可以将一些数据类型转换为另外一个类型,语法如下:
CAST(expr AS type)
其中expr是需要转换的值,type是指目标数据类型。MySQL支持的类型如下:
CHAR[(N)]
BINARY[(N)]
DATE
DATETIME
TIME
DECIMAL[(M[,D])],其中M是最大位数,D是小数位数
SIGNED [INTEGER]
UNSIGNED [INTEGER]
例如,我们将一个字符串转换成数值类型:
SELECT CAST('123' AS SIGNED);
-- 输出:123
2. 处理溢出
对于转换超出目标数据类型范围的值,MySQL会对其进行截取或四舍五入,但是不会抛出错误:
对于CHAR或BINARY类型,超出长度的部分将会被截取掉:
SELECT CAST('123456' AS CHAR(3));
-- 输出:123
对于DECIMAL类型,超过最大位数的部分将会四舍五入,并输出警告:
SELECT CAST('123456.789' AS DECIMAL(5,2));
-- 输出:12345.79
-- 输出警告:Out of range value for column 'CAST('123456.789' AS DECIMAL(5,2))' at row 1
对于整型类型,超出范围的值会按照以下方式处理:
如果目标数据类型是UNSIGNED类型,超出范围将会被截断为最大值。比如说UNSIGNED TINYINT的最大值为255,如果我们将256转换成UNSIGNED TINYINT,它的结果就是255。
如果目标数据类型是SIGNED类型,超出范围将会被转换为最小或最大值。比如说TINYINT的最小值为-128,最大值为127,如果我们将128转换成TINYINT,它的结果就是127。
需要注意的是,如果我们想要抛出错误,可以使用MySQL的STRICT模式。在STRICT模式下,对于任何转换超出目标数据类型范围的值都会抛出错误。开启STRICT模式的方法如下:
SET sql_mode = 'STRICT_ALL_TABLES';
3. 总结
在MySQL中,使用CAST进行数据类型转换时,如果将一个超出目标数据类型范围的值转换为该数据类型,MySQL会对其进行截取或四舍五入,但是不会抛出错误。如果需要抛出错误,可以开启STRICT模式。