有没有办法检测mysql中的溢出?

时间:2014-02-26 17:25:57

标签: php mysql sql

经过一段时间试图杀死这个bug,我直接测试了sql查询:

UPDATE noticias SET
    data_destaque_ini='2013-12-03', data_destaque_fim='',
    fotoDestaque_x=-3, fotoDestaque_y=-102,
    fotoDestaque_escala=154, destacar=1
WHERE idNoticia=3

fotoDestaque_escala保持与以前相同的值:127。嗯,这是一个“圆”数,对吧?因此,即使没有任何sql错误消息,我打开了结构,就是这样:列设置为TINYINT( - 127到127),并将其更改为SMALLINT解决了问题。

但是考虑到未来,我对MySQL的这种行为感到震惊:我为该列传递了太大的值,MySQL保存了可能的东西,削减了剩下的部分,并没有告诉任何事情 - 客户端仍然存在在黑暗中!

那么,有没有办法以某种方式配置或检测溢出?如果没有,我正在考虑在我的库中进行php级别测试...

2 个答案:

答案 0 :(得分:4)

默认情况下(与strict mode相反),当发生上溢/下溢时,MySQL会发出警告:


mysql> CREATE TABLE t (i TINYINT);
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO t VALUES (128);
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'i' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)


请注意语句#2处的“查询正常,1行受影响,1警告”消息。

SHOW WARNINGS;语句可以作为应用程序的常规SQL查询发出,结果可以像任何常规结果集一样进行解析。

查看此语句的manual page,有一些有趣的选项。

答案 1 :(得分:3)

直接取自MySQL文档中的11.2.6 Out-of-Range and Overflow Handling

  

当MySQL将值存储在超出列数据类型允许范围的数值列中时,结果取决于当时生效的SQL模式:

     
      
  • 如果启用了严格的SQL模式,MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败。
  •   
  • 如果未启用限制模式,MySQL会将值剪辑到范围的相应端点,并存储结果值。
  •   

因此,如果您想要一个错误,您需要将MySQL置于严格SQL模式5.1.7 Server SQL Modes中描述了如何更改模式。