【发布时间】:2014-07-25 03:55:07
【问题描述】:
当我执行这个查询时
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 |
+------------+
[更新]
查询SELECT * FROM test WHERE sample_col = 'foo'; 是我的代码的一个错误。由于隐式转换,我无法注意到该错误。
我的目的是“如何避免此类查询”或“如何尽快检测到此错误”。所以我想知道停止隐式转换的方法或将错误级别从警告更改为错误的方法。
【问题讨论】:
标签: mysql