MySQL CAST 如何处理溢出?

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模式。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签