经过一段时间试图杀死这个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级别测试...
答案 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中描述了如何更改模式。