日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MySQL update set 和 and的區別

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

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

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

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

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

直接用 and 第一反應其實是會報語法錯誤,不太像是能正常執行的。那么基于騰訊云數據庫 MySQL,實際構造一個簡單的場景,嘗試復現一下這個問題。

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 語句,看一下實際的運行結果:

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>

可以看到這兩個語句確實都不會報錯,且帶 and 的 update 語句匹配到了具體的行(Rows matched: 1),但是沒有修改數據(Changed: 0),標準語法下的 update 語句倒是正常修改了數據。

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

驗證起來很簡單,換個 cname 不為 0 的數據 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)

從結果來看,MySQL 修改 cname 的值為 0,說明確實是當成邏輯運算符來處理了,仔細分析這個語句,會發現 MySQL 按照如下方式來處理:

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

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

’0’ and 97 = 90 and 81 = 80

PS:需要注意,即便是字符型的數據 0,也會被當做 False。

解決方案

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

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

以上就是MySQL update set 和 and的區別的詳細內容,更多關于MySQL update set 和 and的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品三区视频| 亚洲精品高潮| 天堂va在线高清一区| 欧美在线亚洲| 国产综合欧美| 国产主播一区| 蜜臀久久99精品久久一区二区| 成人福利av| 日韩成人亚洲| 久久精品免费一区二区三区| 伊人久久高清| 国产在线日韩| 香蕉久久夜色精品国产| 视频一区二区不卡| 中文字幕中文字幕精品| 日韩一区二区久久| 亚洲欧美日韩视频二区| 一区二区高清| 青青在线精品| 国产精品成人3p一区二区三区| 美腿丝袜亚洲一区| 国内在线观看一区二区三区| 韩国久久久久久| 伊人久久高清| 99xxxx成人网| 日本а中文在线天堂| 亚洲精品大全| 国产视频一区二| 99成人在线视频| 国产亚洲在线| 99热精品在线| 国产一区二区三区亚洲综合| 国产精品成人一区二区网站软件| 免费久久99精品国产| 免费久久99精品国产| 日本麻豆一区二区三区视频| 国产精品一卡| 欧美xxxx中国| 在线亚洲自拍| 国产日韩中文在线中文字幕| 国产69精品久久| 精品一区在线| 亚洲精品乱码日韩| 麻豆一区二区三| 日韩一区亚洲二区| 999在线观看精品免费不卡网站| 午夜一区在线| 麻豆精品99| 亚洲高清成人| 欧美日韩午夜| 91精品一区二区三区综合| 久久福利精品| 久久天堂影院| 亚洲一区二区三区高清| 国产亚洲字幕| 日本久久成人网| 日韩精品久久久久久| 高清久久一区| 视频在线观看91| 欧美激情99| 亚洲国产一区二区在线观看 | 精品美女视频| 亚洲一区中文| 久久精品网址| av成人国产| 久久免费精品| 乱人伦精品视频在线观看| 欧美久久一区二区三区| 秋霞影视一区二区三区| 日韩精品中文字幕一区二区| 桃色av一区二区| 天堂久久一区| 91精品国产调教在线观看| 亚洲资源网站| 精品日韩视频| 欧美亚洲tv| 亚洲欧美日韩国产一区二区| 精品视频一区二区三区四区五区| 麻豆成人在线| 在线观看精品| 欧美黄色精品| 中文精品电影| 亚洲v在线看| 久久精品五月| 日日夜夜免费精品| 久久久一本精品| 国产欧美高清| 在线日韩成人| 91视频精品| 国产情侣一区| 日韩精品电影一区亚洲| 伊人久久大香线蕉av超碰演员| 韩国一区二区三区视频| 欧美日本三区| 亚洲精一区二区三区| 日韩精品免费一区二区在线观看| 欧美午夜三级| 最近国产精品视频| 悠悠资源网久久精品| www.com.cn成人| 国产精品sss在线观看av| 亚洲精品美女91| 91超碰国产精品| 精品免费视频| 国产精品男女| 91欧美极品| 亚洲人成亚洲精品| 欧美成人日韩| 亚洲一级少妇| 国产一区丝袜| 免费看久久久| 国产福利亚洲| 欧美永久精品| 日韩精品视频在线看| 免费看日韩精品| 99视频一区| 婷婷综合五月| 91国内精品| 综合亚洲自拍| 亚洲伊人精品酒店| 国产亚洲永久域名| 亚洲综合精品四区| 麻豆久久精品| 蜜桃视频一区二区三区在线观看| 亚洲中字黄色| 亚洲免费影视| 免费国产亚洲视频| 亚洲一区网站| 香蕉久久国产| 欧美专区在线| 噜噜噜躁狠狠躁狠狠精品视频| 宅男噜噜噜66国产日韩在线观看| 日韩亚洲精品在线| 婷婷综合在线| 精品在线91| 久久午夜视频| 日韩欧美久久| 国产精东传媒成人av电影| 麻豆91小视频| 正在播放日韩精品| 久久国产电影| 亚洲永久字幕| 日本在线成人| 久久不卡日韩美女| 国产一区二区久久久久| 91精品推荐| 久久亚洲不卡| 欧美久久一区二区三区| 欧美精品影院| 精品中文在线| 四虎884aa成人精品最新| 久久久久国产精品一区二区| 午夜日韩在线| 日韩精品高清不卡| 国产在线视频欧美一区| 久久国产电影| 亚洲a成人v| 精品视频黄色| av亚洲在线观看| 亚洲免费毛片| 美女视频黄免费的久久| 三级在线看中文字幕完整版| 极品日韩av| 亚洲色图网站| 日本不卡的三区四区五区| 国产精品一区2区3区| 国产一区二区精品福利地址| 亚洲高清毛片| 日韩av一区二区在线影视| 国产精品久久久久9999高清| 精品久久久网| 亚洲精品成人| 亚洲欧洲av| 国产福利片在线观看| 欧美综合二区| 欧美亚洲福利| 久久国产中文字幕| 亚洲欧美日本视频在线观看| 国产精品一区二区三区www| 国产视频网站一区二区三区| 亚洲啊v在线| 91亚洲一区| 免费在线观看视频一区| 精品成人18| 在线精品视频在线观看高清| 国产麻豆一区二区三区精品视频| 久久香蕉精品香蕉| 99riav国产精品| 日本亚洲视频| 美日韩一区二区三区| 欧美精品一卡| 国产日韩一区二区三区在线| 欧美不卡高清一区二区三区| 国产亚洲网站| 国产精品magnet| 最近高清中文在线字幕在线观看1| 日韩在线卡一卡二| аⅴ资源天堂资源库在线| 黑丝一区二区| 国产一区2区|