10

我创建了一个包含 INT 类型列的表:

CREATE TEMPORARY TABLE `myTab` (`int` INT, `text` TEXT, `float` FLOAT);

现在我尝试在 INT 列中添加一个浮点值

INSERT INTO `myTab` (`int`) VALUES (13.34);

我没有收到警告:

SHOW WARNINGS;

尽管该列之后仅包含 13 个:

SELECT * FROM `myTab`;

将浮点值添加到整数列时,是否有可能收到警告?我目前正在使用mysql Ver 14.14 Distrib 5.5.31, for debian-linux-gnu (i686) using readline 6.2

添加:我想避免为每个 INT 列添加“检查点”(如何检查值是否为 MySQL 中的整数?)。我希望在转换为 INT 期间数据丢失时发出警告。

4

2 回答 2

8

您可以使用DECIMAL(n, 0)type 而不是INT. 尝试在此类列中插入非整数数字会引发警告。

CREATE TEMPORARY TABLE t (id DECIMAL); -- equivalent to the default DECIMAL(10, 0), which covers the range of INT
INSERT INTO t VALUES (0.9); -- raises warning "1265 - Data truncated for column 'id' at row 1"
SELECT * FROM t; -- 0.9 was rounded to 1

我知道这只是一种解决方法,并且肯定会对性能产生负面影响(尽管可能很小)。但这是我能够想出的唯一可行的解​​决方案。

于 2013-05-24T14:44:10.690 回答
4

编辑:我已经测试了不同的场景来尝试得到一个警告或至少一个错误,但没有运气,所以我怀疑它要么是预期的行为,要么是一个mysql 错误(尽管我没有发现一个已知的错误描述了这一点)所以我认为最好/唯一的解决方案是由YaK

用这个:

传统的

让 MySQL 表现得像一个“传统”的 SQL 数据库系统。这种模式的简单描述是在向列中插入不正确的值时“给出错误而不是警告”。

set global sql_mode="TRADITIONAL";

有关更多信息,请阅读

更新:我上面的目的是得到错误而不是警告,因为警告仍然插入数据,因此您将有损坏的数据,但如果您仍然想使用警告而不是错误,那么您必须使用默认的 sql_mode:

set global sql_mode="";

编辑:确保警告已启用:

set global sql_warnings=1;

更好的是,您可以将其添加到配置文件my.cnf中,以便在 mysql 重新启动时不会被覆盖。

在此处输入图像描述

于 2013-05-21T14:52:15.100 回答