成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL中Varchar和Int隱式轉換的小秘密

數據庫 MySQL
經過半天的探索,「發現這是MySQL優化器中,判斷數據類型不匹配的比較時,MySQL 優化器會進行隱式類型轉換!」下面我們一起來看看這個隱式轉換,到底是怎么轉換的!

一、前言

在一個陽光明媚的下午,我們的測試在運行SQL時發現了一個靈異事件。別著急,等我慢慢說來,是一個查詢庫存的SQL,控制臺打印了,查詢為0條記錄。想著不太信,自己把SQL粘出來執行一下,「剛好有個varchar類型的字段,查詢的是一堆數字,忘記加引號了。」結果查詢出來了一條!

從頭看到結尾,發現我們查詢條件的字段值為231120103,把數據庫中231120103-1的查詢出來了!

經過半天的探索,「發現這是MySQL優化器中,判斷數據類型不匹配的比較時,MySQL 優化器會進行隱式類型轉換!」

下面我們一起來看看這個隱式轉換,到底是怎么轉換的!

要知其然,知其所以然。

二、實踐出真知

1、建表

CREATE TABLE `str_test`  (
  `id` int(0) NOT NULL,
  `str_column` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `int_column` int(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

我們新建一個表,里面有varchar和int類型,插入幾條方便測試!

INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (1, '123', 123);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (2, '123-1---1122', 12);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (3, 'abc', 1);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (4, '783221667772672728', 2147483647);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (5, '783221667772672798', 2147483647);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (6, '0', 0);

2、測試查詢

我們先以int類型查詢varchar作為測試:

SELECT * FROM `str_test` WHERE str_column = 123;

大家是不是認為這里只能查詢出一條數據,答案是錯誤的!我們后面統一說結論,這里先看測試!

我們在插入一條str_column位數超過18位的!讓轉化時丟失精度,從而實現多查的情況!

我們看到查詢的和被查詢出來的是不一樣的!

我們在以varchar來查詢int字段:

SELECT * FROM `str_test` WHERE int_column = '12A333';

還是可以查詢到數據!

3、結論

經過上面的測試是不是已經汗流浹背了!不要慌,下面我們來揭曉答案!

有興趣的可以看看官網文檔:MySQL5.7文檔:https://dev.mysql.com/doc/refman/5.7/en/type-conversion.html

?

當整數與字符串進行比較時,無論數據庫是int還是varchar,只要類型不一致時,MySQL會嘗試將字符串轉換為整數進行比較。 

如果字符串以有效的數字開頭,則將其轉換為相應的整數值。 

解析規則:從開頭解析直到遇到非數字的字符結束,前面的會作為比較的值,非數字后面的直接拋棄。 

如果字符串以非數字字符開頭,將被轉化為0。 

數值過大時,回傳精度損失,也會出現匹配。沒找到具體的臨界值,超過18位會出現浮點數精度損失!

?

三、隱式轉換的缺點

  • 精度損失:隱式轉換可能導致精度損失問題,上面我們演示過了。
  • 性能開銷:在進行大規模數據處理時,頻繁的隱式轉換可能會對性能產生影響。
  • 索引失效:存在隱式轉換會讓優化器無法使用索引進行優化查詢,影響響應時間。
  • 數據安全風險:如果是一個刪除語句,像上面演示的會出現匹配到其他行,從而導致數據被誤刪。還有多查的問題。

四、總結

當然這個其實也是一個面試題,大家是不是已經會了!

之前在MySQL索引失效時,就了解過隱式轉換,只知道會轉換,今天才有了更深刻的認識。

其實這個情況我們還是要避免的,不能是MySQL不給我們報錯,我們就這樣不規范的寫。

這要是生產上,一個刪除匹配到多條,和刪庫跑路性質一樣了!

大家還是要小心哈,一定不要出現隱式轉換!

責任編輯:姜華 來源: 小王博客基地
相關推薦

2019-07-22 09:46:28

WebSocketNginx服務器

2019-08-30 08:39:33

WebSocketNginx服務器

2019-09-10 16:25:19

Python內存空對象

2016-03-31 14:51:33

多云計算多云部署多云管理

2016-01-08 14:23:55

2012-03-23 10:27:08

觸屏手機點擊區域

2017-12-15 21:46:45

2013-11-25 10:43:32

谷歌微軟

2010-05-13 00:03:44

2015-03-09 09:34:04

C語言函數指針

2018-08-15 08:47:20

2011-12-09 17:41:56

2010-10-12 12:10:52

增強無線網絡信號

2015-04-14 09:46:09

Apple Watch秘密

2025-03-19 08:40:00

2015-03-06 10:33:02

2015-11-27 10:13:19

數據中心

2019-06-05 12:49:07

云辦公

2021-06-10 05:17:52

QQ應用手機QQ

2020-06-30 09:25:49

無線路由器Wi-Fi網絡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产欧美日韩精品 | 欧美激情精品久久久久 | 亚洲欧美日韩国产综合 | av中文在线| 亚洲欧美日韩在线不卡 | 91精品国产高清一区二区三区 | 一级片av| 亚洲精品一区二三区不卡 | 国产69精品久久99不卡免费版 | 欧美女优在线观看 | 日本一区二区三区在线观看 | 中文字幕第二区 | 国产在线精品一区二区三区 | 亚洲三级视频 | 视频一二三区 | 日韩高清国产一区在线 | 亚洲视频在线播放 | 国产在线一区二区 | 国产日韩一区二区三免费高清 | 少妇精品久久久久久久久久 | 亚洲一区二区高清 | 视频1区 | 国产电影一区 | 欧美在线国产精品 | 久久久久国色av免费观看性色 | 亚洲91精品 | 亚洲精品大全 | 日本视频一区二区三区 | 精品久久久久久亚洲精品 | 国产精品一区二区在线 | 国产一区在线免费 | 亚洲国产一区在线 | 亚洲综合视频 | 国产日韩一区二区 | 欧美日韩国产综合在线 | 国产精品美女久久久久aⅴ国产馆 | 精品国产一区二区三区观看不卡 | 精品国产伦一区二区三区观看体验 | 亚洲欧美一区二区三区国产精品 | 99pao成人国产永久免费视频 | 国色天香成人网 |