如何避免MySQL的隐式转换(截断错误的DOUBLE值)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何避免MySQL的隐式转换(截断错误的DOUBLE值),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2316字,纯文字阅读大概需要4分钟。
内容图文
![如何避免MySQL的隐式转换(截断错误的DOUBLE值)](/upload/InfoBanner/zyjiaocheng/904/e064842e6695431db0088c3a261b675b.jpg)
当我执行此查询时
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’;是我的代码的错误.由于隐式转换,我无法注意到这个错误.
我的目的是“如何避免此类查询”或“如何快速检测此错误”.所以我想知道停止隐式转换的方法或者将此错误级别从警告更改为错误的方法.
解决方法:
您应该尝试使用CAST或CONVERT函数显式地强制转换它,如下所示,并且不要指望隐式转换.
SELECT * FROM test WHERE sample_col = cast('foo' as int);
(OR)
SELECT * FROM test WHERE cast(sample_col as varchar) = 'foo';
此外,没有必要将INT类型列与字符串值和AFAIK进行比较,没有这样的设置来阻止隐式转换.如果你真的想导致错误而不是将其转换为0然后明确地转换它;在这种情况下,它会出错.
有关更多信息,请参见Type Conversion in Expression Evaluation.
内容总结
以上是互联网集市为您收集整理的如何避免MySQL的隐式转换(截断错误的DOUBLE值)全部内容,希望文章能够帮你解决如何避免MySQL的隐式转换(截断错误的DOUBLE值)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。