2014-02-26 55 views
3

一段时间后,试图杀死这个错误,我是直接测试SQL查询:有没有办法在mysql中检测溢出?

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水平测试,以...

+0

你要买什么?一种将它作为警告来检测的方法,或者全面拒绝更新该行? –

+0

运行查询的代码是什么? MySQL应该抛出一个“超出范围值”警告。 –

+0

我期待从mysqli_query一个假的回报,比我管理的错误。它的接缝工作不同,它返回TRUE,但有某个地方有警告(我在下面看)。 – Gustavo

回答

3

11.2.6 Out-of-Range and Overflow Handling MySQL文档中采取直接:

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

  • 如果启用严格SQL模式,MySQL将拒绝超出范围的值并返回错误,并且插入失败,符合SQL标准。
  • 如果没有限制性的模式被启用时,MySQL剪辑值到范围并存储的相应的端点所得到的值来代替。

所以,如果你想要一个错误,你需要把MySQL来严格的SQL模式5.1.7 Server SQL Modes中描述了如何更改模式。

+0

在此链接之后,mySQL以不同的方式工作,并可以在会话中对其进行更改。我认为这些模式应该链接到我的图书馆的错误处理部分。我想的方式是“传统”模式(返回一个错误,而不是一个警告),所以我想他们会停止使用它作为默认的原因...我会考虑。 – Gustavo

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) 


通知“查询行,1行受影响,1级警告”的声明#2的消息。

SHOW WARNINGS;语句可以发出从您的应用程序一个普通的SQL查询,其结果可以被解析如同任何普通的结果集。

结账manual page对于这个声明,有几个有趣的选项。

相关问题