在精确数学中,只要可能,就使用给定的精确值。例如,比较中的数字完全按照给定值使用,不改变值。在严格的SQL模式下,for插入
转换到具有精确数据类型(小数
或整数),如果数字在列范围内,则插入它的确切值。检索时,该值应与插入的值相同。(如果没有启用严格的SQL模式,截断插入
是允许的)。
数值表达式的处理取决于表达式包含的值类型:
如果数值表达式包含任何字符串,则将它们转换为双精度浮点值,表达式是近似的。
控件控制的SQL模式会影响对数字列的插入sql_mode
系统变量。(见第5.1.11节,“服务器SQL模式”)。下面的讨论提到了严格模式(由STRICT_ALL_TABLES
或STRICT_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 |
错误条件;没有插入任何行。 |