MySQL UPDATE语句中的一个诡异现象
2015-10-22 16:57
786 查看
给你一个很简单的语句,你能一眼看出语句的存在的问题么?
表结构如下:
表中数据如下:
我要说的SQL如下:
有问题么???不知大家有没看出来,我第一次执行开发提交过来的类似这么一条语句前根本没有发现问题。执行完发生了诡异现象才意识到问题所在。
对的,UPDATE中更新多个字段时中字段间不是用AND而是要用”,”,但用AND时MySQL居然不报语法错误,而只在一定条件下报类型错误,多数情况下什么错误都没有,只是结果看起来比较异常。
不妨通过例子来看看:
值发生了更新,但是name神奇的变成了1,address没有发生变化。
值发生了变化,但这次name神奇的变为了0,address没有变化。
当把address试图写成整型时报错
重新恢复address为字符串型是又可执行成功,且name变成了0
真是太诡异了,以后使用UPDATE语句是一定要注意。一个符号之差,造成十分危险的后果。
表结构如下:
CREATE TABLE `test_update` ( `id` int(11) DEFAULT NULL, `name` varchar(10) NOT NULL, `address` varchar(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
表中数据如下:
mysql> select * from test_update; +------+---------+----------+ | id | name | address | +------+---------+----------+ | 1 | caoye | shanghai | | 2 | kezhu | beijing | | 3 | yanzhao | luoyang | +------+---------+----------+ 3 rows in set (0.02 sec)
我要说的SQL如下:
UPDATE test_update SET NAME = '123' AND address = "ShangHai" WHERE id = 1;
有问题么???不知大家有没看出来,我第一次执行开发提交过来的类似这么一条语句前根本没有发现问题。执行完发生了诡异现象才意识到问题所在。
对的,UPDATE中更新多个字段时中字段间不是用AND而是要用”,”,但用AND时MySQL居然不报语法错误,而只在一定条件下报类型错误,多数情况下什么错误都没有,只是结果看起来比较异常。
不妨通过例子来看看:
mysql> update test_update set name='CaoYe' and address="ShangHai" where id=1; ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'CaoYe' mysql> update test_update set name='123' and address="ShangHai" where id=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test_update; +------+---------+----------+ | id | name | address | +------+---------+----------+ | 1 | 1 | shanghai | | 2 | kezhu | beijing | | 3 | yanzhao | luoyang | +------+---------+----------+
值发生了更新,但是name神奇的变成了1,address没有发生变化。
mysql> update test_update set name='234' and address="456" where id=1; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test_update; +------+---------+----------+ | id | name | address | +------+---------+----------+ | 1 | 0 | shanghai | | 2 | kezhu | beijing | | 3 | yanzhao | luoyang | +------+---------+----------+ 3 rows in set (0.02 sec)
值发生了变化,但这次name神奇的变为了0,address没有变化。
mysql> update test_update set name=345 and address=678 where id=3; ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'luoyang'
当把address试图写成整型时报错
mysql> update test_update set name=345 and address="678" where id=3; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from test_update; +------+------+----------+ | id | name | address | +------+------+----------+ | 1 | 0 | shanghai | | 2 | 0 | beijing | | 3 | 0 | luoyang | +------+------+----------+ 3 rows in set (0.01 sec)
重新恢复address为字符串型是又可执行成功,且name变成了0
真是太诡异了,以后使用UPDATE语句是一定要注意。一个符号之差,造成十分危险的后果。
相关文章推荐
- MySQL中一些查看事务和锁情况的常用语句
- [转]MYSQL 查询优化
- mysql left( right ) join使用on 与where 筛选的差异
- MySQL NOT EXISTS优化的一个案例
- MySQL和MySQLi的区别
- MySQL DECIMAL数据类型
- 拯救mysql单表数据
- mysql 参数作用域
- [MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
- mysql InnoDB引擎 共享表空间和独立表空间(转载)
- Mysql优化ibdata1大小
- mysql按年度、季度、月度、周、日统计查询的sql语句
- MySQL 时间戳(Timestamp)函数
- c#操作mysql积累
- mysql 表的创建、删除、更改、和查询
- Mysql字符集
- web开发 mysql数据库操作 之 分页技术
- Orcale 和 MySql的区别 五十点
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
- MySql常用命令总结