好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > MySQL update set 和 and的區別

MySQL update set 和 and的區別

熱門標簽:武漢電銷機器人電話 催天下外呼系統 html地圖標注并導航 南太平洋地圖標注 400電話變更申請 呂梁外呼系統 400電話辦理服務價格最實惠 大豐地圖標注app 北京金倫外呼系統

問題描述

最近接到一個奇怪的咨詢,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: 0

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> 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: 0

mysql> 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: 0

mysql> 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+PostgreSQL批量插入更新insertOrUpdate
  • MySQL UPDATE 語句的非標準實現代碼
  • mysql update case 更新字段值不固定的操作
  • Mysql update多表聯合更新的方法小結
  • mysql事務select for update及數據的一致性處理講解
  • MySQL UPDATE 語句一個“經典”的坑

標簽:龍巖 自貢 麗水 南充 西寧 徐州 迪慶 無錫

巨人網絡通訊聲明:本文標題《MySQL update set 和 and的區別》,本文關鍵詞  MySQL,update,set,和,and,的,區別,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL update set 和 and的區別》相關的同類信息!
  • 本頁收集關于MySQL update set 和 and的區別的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 美女裸体?开腿羞羞吞精| 男生女生一起差差的视频| 久久国产精品吴梦梦| 亚洲AV一区二区国产精品| 真人AL亚洲视美女www直播| 卢湾区| 四影虎影ww4hu702| 奇米亚洲Av一区二区三区| 仙尊双乳高耸嗯啊H双性| 国产做| 国产精品无码AV天天爽水蜜桃| 无码少妇高潮喷水A片免费| 精品久久久久免费影院的功能介绍 | 我和岳互换的性荡生活| 好多水好爽小荡货np| 日本护士献身取精a播放| 男人J放进女人亅免费观看 | 午夜看片a福利在线| 女邻居的大乳HD| 韩国电影《私人教练》| 東京熱大亂交在线AV一区二区| 精品国产三级国产AⅤ在线观看| 国产精品无圣光在线一区| 久久综合网址| 国产三级午夜理伦三级 | 国产AV送外卖剧情在线观看| 国产女人的一级毛片视频| 黄频在线| 亚洲精品?无码一区二区在直播间| 午夜黄页网站在线播放| 欧美freesex黑人又粗又| 国产一区二区视频在线播放| 自愿被流氓糟蹋视频| 娇妻边打电话边被躁BD在| 鲤鱼乡喘息弓起潮湿| 被上司中出| 扒开小泬疯狂做爰XXXⅩ| 我被老外添得太舒服了| 狠狠色噜噜狠狠狠米奇9999| 国产GaysexChina男外卖| 99AV国产精品欲????麻豆 |