10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

12.25.3表达式处理

在精确数学中,只要可能,就使用给定的精确值。例如,比较中的数字完全按照给定值使用,不改变值。在严格的SQL模式下,for插入转换到具有精确数据类型(小数或整数),如果数字在列范围内,则插入它的确切值。检索时,该值应与插入的值相同。(如果没有启用严格的SQL模式,截断插入是允许的)。

数值表达式的处理取决于表达式包含的值类型:

  • 如果存在任何近似值,则表达式是近似值,并使用浮点算法进行计算。

  • 如果没有近似值,则表达式只包含精确值。如果任何精确值包含小数部分(小数点后的值),则使用小数精确的算术,精度为65位。这个词确切的受二进制表示的限制。例如,1.0/3.0可以用十进制近似表示为对于brute……,但没有写出确切的数字,所以(1.0/3.0) * 3.0不评估到到底1.0

  • 否则,表达式只包含整数值。表达式是精确的,并使用整数算法进行计算,其精度与长整型数字(64位)。

如果数值表达式包含任何字符串,则将它们转换为双精度浮点值,表达式是近似的。

控件控制的SQL模式会影响对数字列的插入sql_mode系统变量。(见第5.1.11节,“服务器SQL模式”)。下面的讨论提到了严格模式(由STRICT_ALL_TABLESSTRICT_TRANS_TABLES模式值),ERROR_FOR_DIVISION_BY_ZERO.要打开所有限制,只需使用传统的模式,它包括严格模式值和ERROR_FOR_DIVISION_BY_ZERO

设置sql_mode =“传统”;

如果将数字插入到精确类型列中(小数或整数),如果它在列范围和精度内,则插入它的确切值。

如果该值的小数部分有太多的数字,则会进行舍入并生成注释。四舍五入如中所述第12.25.4节,“舍入行为”.即使在严格模式下,由于舍入小数部分而造成的截断也不是错误。

如果该值的整数部分有太多的数字,则该值太大(超出范围),处理方法如下:

  • 如果未启用严格模式,则将该值截断为最接近的合法值,并生成警告。

  • 如果启用了严格模式,则会出现溢出错误。

小数对于字面量,除了65位的精度限制外,还有字面量文本的长度限制。如果该值超过大约80个字符,可能会出现意外结果。例如:

mysql >选择演员(0000000000000000000000000000000000000000000000000000000000000000000000000000000020.01小数(15日2))为val;+------------------+ | 瓦尔  | +------------------+ | 9999999999999.99  | +------------------+ 1行集,2警告(0.00秒)mysql >显示警告;+---------+------+----------------------------------------------+ | 水平| |消息代码  | +---------+------+----------------------------------------------+ | 警告| 1292 |截断错误的十进制值:“20”| | 1264 | |警告范围值列在第一行“val”  | +---------+------+----------------------------------------------+ 2行集(0.00秒)

未检测到下溢,因此下溢处理未定义。

对于将字符串插入数字列,如果字符串具有非数字内容,则按如下方式处理从字符串到数字的转换:

  • 不以数字开头的字符串不能用作数字,并在严格模式下产生错误,否则将产生警告。这包括空字符串。

  • 以数字开头的字符串可以进行转换,但后面的非数字部分会被截断。如果截断的部分不包含空格,则在严格模式下会产生错误,否则会产生警告。

默认情况下,除零产生的结果为没有警告。通过适当地设置SQL模式,可以限制除零。

ERROR_FOR_DIVISION_BY_ZERO启用SQL模式,MySQL处理除0的方式不同:

  • 如果没有启用严格模式,则会出现警告。

  • 如果启用了严格模式,则禁止使用除数为零的插入和更新,并会出现错误。

换句话说,涉及执行除数为零的表达式的插入和更新可以被视为错误,但这需要ERROR_FOR_DIVISION_BY_ZERO除了严格模式。

假设我们有这样的陈述:

INSERT INTO t SET i = 1/0;

这就是严格和ERROR_FOR_DIVISION_BY_ZERO模式。

sql_mode价值 结果
(默认) 没有警告,就没有错误;被设置为
严格的 没有警告,就没有错误;被设置为
ERROR_FOR_DIVISION_BY_ZERO 警告,没有错误;被设置为
严格的,ERROR_FOR_DIVISION_BY_ZERO 错误条件;没有插入任何行。