色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL update set 和 and的區(qū)別

瀏覽:2日期:2023-10-03 13:09:00
問題描述

最近接到一個奇怪的咨詢,update 語句執(zhí)行沒有報錯,但是沒有更新數(shù)據(jù),具體有問題的語句類似于如下形式:

update test.stu set cname = ’0’ and math = 90 and his = 80 where id = 100;原因分析

直觀上看,這個 update 語句的語法是有問題的,正常更新多列數(shù)據(jù)的語法應(yīng)該是用逗號,類似于如下形式:

update test.stu set cname = ’0’,math = 90,his = 80 where id = 100;

直接用 and 第一反應(yīng)其實(shí)是會報語法錯誤,不太像是能正常執(zhí)行的。那么基于騰訊云數(shù)據(jù)庫 MySQL,實(shí)際構(gòu)造一個簡單的場景,嘗試復(fù)現(xiàn)一下這個問題。

SQL 語句如下:

CREATE TABLE `stu` ( `id` int(11) NOT NULL, `sname` varchar(16) NOT NULL, `cname` varchar(8) DEFAULT NULL, `math` int(11) NOT NULL, `eng` int(11) DEFAULT NULL, `his` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into stu values(100,’sam’,’0’,90,88,83);insert into stu values(101,’jhon’,’1’,97,82,81);insert into stu values(102,’mary’,’2’,87,89,92);insert into stu values(103,’adam’,’2’,87,89,92);

然后分別試一試正常的 update 語句和使用 and 的 update 語句,看一下實(shí)際的運(yùn)行結(jié)果:

mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> update test.stu set cname = ’0’ and math = 90 and his = 80 where id = 100;Query OK, 0 rows affected (0.00 sec)Rows matched: 1 Changed: 0 Warnings: 0mysql> select * from stu;+-----+-------+-------+------+------+------+| id | sname | cname | math | eng | his |+-----+-------+-------+------+------+------+| 100 | sam | 0 | 90 | 88 | 83 || 101 | jhon | 1 | 97 | 82 | 81 || 102 | mary | 2 | 87 | 89 | 92 || 103 | adam | 2 | 87 | 89 | 92 |+-----+-------+-------+------+------+------+4 rows in set (0.00 sec)mysql> update test.stu set cname = ’0’,math = 90,his = 80 where id = 100;Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from stu;+-----+-------+-------+------+------+------+| id | sname | cname | math | eng | his |+-----+-------+-------+------+------+------+| 100 | sam | 0 | 90 | 88 | 80 || 101 | jhon | 1 | 97 | 82 | 81 || 102 | mary | 2 | 87 | 89 | 92 || 103 | adam | 2 | 87 | 89 | 92 |+-----+-------+-------+------+------+------+4 rows in set (0.00 sec)mysql> rollback;Query OK, 0 rows affected (0.01 sec)mysql>

可以看到這兩個語句確實(shí)都不會報錯,且?guī)?and 的 update 語句匹配到了具體的行(Rows matched: 1),但是沒有修改數(shù)據(jù)(Changed: 0),標(biāo)準(zhǔn)語法下的 update 語句倒是正常修改了數(shù)據(jù)。

由此可見,MySQL 在語法上,并不認(rèn)為 and 這個用法是錯誤的,那么說明 MySQL 用另外的方式“解讀”了這個語句。最容易想到的,就是 MySQL 是不是在 set 的時候,把 and 解釋成了邏輯運(yùn)算符,而不是英文意義上的“和”?而且 cname 的取值本來就是 0,也符合數(shù)據(jù)庫處理 bool 數(shù)據(jù)時的行為(用 0 和 1 代替 False 和 True)。

驗(yàn)證起來很簡單,換個 cname 不為 0 的數(shù)據(jù) update 一下就可以了:

mysql> select * from stu;+-----+-------+-------+------+------+------+| id | sname | cname | math | eng | his |+-----+-------+-------+------+------+------+| 100 | sam | 0 | 90 | 88 | 83 || 101 | jhon | 1 | 97 | 82 | 81 || 102 | mary | 2 | 87 | 89 | 92 || 103 | adam | 2 | 87 | 89 | 92 |+-----+-------+-------+------+------+------+4 rows in set (0.00 sec)mysql> begin;update test.stu set cname = ’0’ and math = 90 and his = 80 where id = 101;Query OK, 0 rows affected (0.00 sec)Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from stu;+-----+-------+-------+------+------+------+| id | sname | cname | math | eng | his |+-----+-------+-------+------+------+------+| 100 | sam | 0 | 90 | 88 | 83 || 101 | jhon | 0 | 97 | 82 | 81 || 102 | mary | 2 | 87 | 89 | 92 || 103 | adam | 2 | 87 | 89 | 92 |+-----+-------+-------+------+------+------+4 rows in set (0.00 sec)mysql> rollback;Query OK, 0 rows affected (0.00 sec)

從結(jié)果來看,MySQL 修改 cname 的值為 0,說明確實(shí)是當(dāng)成邏輯運(yùn)算符來處理了,仔細(xì)分析這個語句,會發(fā)現(xiàn) MySQL 按照如下方式來處理:

set cname = (’0’ and math = 90 and his = 80)

math 和 his 的取值是根據(jù) where 條件篩選的行來決定的,實(shí)際對應(yīng)到上面測試的場景,會變成如下的邏輯判斷:

’0’ and 97 = 90 and 81 = 80

PS:需要注意,即便是字符型的數(shù)據(jù) 0,也會被當(dāng)做 False。

解決方案

目前并不能通過 sql_mode 或者其他參數(shù)的形式來阻止這種帶 and 的 update 語句,因此這一類問題的隱蔽性比較強(qiáng)。建議在開發(fā)的時候,利用封裝好的框架,或者加強(qiáng)代碼或者 SQL review 來避免這個問題。

PS:騰訊云數(shù)據(jù)庫 MySQL 也會有類似的問題,需要警惕。

以上就是MySQL update set 和 and的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于MySQL update set 和 and的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 久久精品国产欧美 | 亚洲人成亚洲精品 | 亚洲成人高清在线观看 | 亚洲三级免费 | 久久免费视频99 | 5388国产亚洲欧美在线观看 | 欧美一级毛片免费看视频 | 亚洲人成综合网站在线 | 久久中文字幕乱码免费 | 欧美13一14周岁a在线播放 | 国产成人精品一区二区三在线观看 | 国产欧美日韩精品高清二区综合区 | 免费观看情趣v视频网站 | 亚洲精品一区二区三区在 | 自拍偷拍亚洲区 | 9191在线亚洲精品 | 欧美一级片免费 | 国产精品二区高清在线 | 亚洲3级| 欧美成人影院 | 国产精品伦理久久久久 | 性欧美高清极品xx | 亚洲在线不卡 | 在线看片亚洲 | 草草影院ccyy免费看片 | 九九精品免费观看在线 | 亚洲毛片免费观看 | 精品一区二区三区在线视频 | 国产一区二区精品久久91 | 一本色道久久88亚洲精品综合 | 男人添女人下面免费毛片 | 99色播| 亚洲精品99久久一区二区三区 | 在线国产观看 | 国产免费自拍视频 | 欧美aaaaaaaaa| 偷拍自拍第一页 | 在线视频精品视频 | 成人欧美一区二区三区 | 国产精品亚欧美一区二区三区 | a级国产乱理伦片在线观看99 |