如何避免MySQL的隐式转换(截断错误的DOUBLE值)

时间:2014-07-25 03:55:07

标签: mysql

执行此查询时

mysql> SELECT * FROM test WHERE sample_col = 'foo';

使用此表。

mysql> SHOW CREATE TABLE test\G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sample_col` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> SELECT * FROM test;
+----+------------+
| id | sample_col |
+----+------------+
|  1 |          0 |
|  2 |          1 |
|  3 |          2 |
+----+------------+
3 rows in set (0.00 sec)

MySQL会自动将WHERE子句的'foo'转换为零,并收到此警告消息。

mysql> SELECT * FROM test WHERE sample_col = 'foo';
+----+------------+
| id | sample_col |
+----+------------+
|  1 |          0 |
+----+------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'foo' |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)

如何配置MySQL以将此警告报告为错误? (或者如何停止隐式转换?)

我已将SQL_MODE设置为严格但似乎不会影响SELECT语句。

mysql> SELECT @@SQL_MODE;
+------------------------------------------+
| @@SQL_MODE                               |
+------------------------------------------+
| STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION |
+------------------------------------------+

MySQL的版本是5.6.16。

mysql> SELECT @@VERSION;
+------------+
| @@VERSION  |
+------------+
| 5.6.16-log |
+------------+

[UPDATE]

查询SELECT * FROM test WHERE sample_col = 'foo';是我的代码的错误。由于隐式转换,我无法注意到这个错误。 我的目的是“如何避免此类查询”或“如何快速检测此错误”。所以我想知道停止隐式转换的方法或者将此错误级别从警告更改为错误的方法。

2 个答案:

答案 0 :(得分:2)

您应该尝试使用CASTCONVERT功能明确地将其强制转换,并且不要依赖于隐式转换。

SELECT * FROM test WHERE sample_col = cast('foo' as int);

(OR)

SELECT * FROM test WHERE cast(sample_col as varchar) = 'foo';

此外,没有必要将INT类型列与string值和AFAIK进行比较,没有此类设置可用于停止隐式转换。如果你真的想导致错误而不是将其转换为0然后明确地转换它;在这种情况下,它会出错。

有关详细信息,请参阅Type Conversion in Expression Evaluation

答案 1 :(得分:0)

我不知道为什么需要将整数与char数据类型进行比较。但是,如果您想摆脱该问题,请在选择查询中键入将整数列转换为char类型。

SELECT * FROM test WHERE cast(sample_col as char) = 'foo';