【问题标题】:How to avoid implicit conversion of MySQL (Truncated incorrect DOUBLE value)如何避免 MySQL 的隐式转换(截断不正确的 DOUBLE 值)
【发布时间】: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


    【解决方案1】:

    您应该尝试使用下面的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 了解更多信息。

    【讨论】:

    • @kosei,如果你读过我的回答;已经明确提到没有这样的设置来停止隐式转换/强制转换。如果您真的想避免这种情况,请使用显式强制转换。这样,它将确保如果转换失败,则抛出您想要的错误。
    • 我错过了您答案的第 3 段。我知道没有停止隐式转换的设置。谢谢。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2017-11-02
      • 2018-06-28
      相关资源
      最近更新 更多