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

數據庫丨從MySQL數值隱式轉換成了double型的測試點,值得學習

數據庫 MySQL 測試
原來在MySQL中,當操作符與不同類型的操作數一起使用時,會發生類型轉換以使操作數兼容,即字符型字段與數值型值比較時,會進行隱式類型轉換:都轉換為數值型。

一、背景

在進行某項系統測試時,遇到選擇部分保單更新為加急狀態后,未選中的保單也同步更新成了加急狀態。

經過比對分析,發現是SQL查詢在數據庫設計為字符型的字段,SQL語句中用了數值型來查詢時,查詢結果結果會多了末尾兩位不一致的值,如下圖,100320201000195806搜出100320201000195812等值:

百因必有果,通過度娘,首先了解到原來在MySQL中,當操作符與不同類型的操作數一起使用時,會發生類型轉換以使操作數兼容,即字符型字段與數值型值比較時,會進行隱式類型轉換:都轉換為數值型。

即,數據庫字段值為字符型1234,查詢條件為數值1234的時候,數據庫字符型1234會轉換為數值型1234,能夠查詢到對應值。

但為什么數值型100320201000195806除了搜索出100320201000195806還有100320201000195812這樣的字符型結果?

二、問題根因

數值隱式轉換成了double型,考慮數值可能出現溢出。根據DOUBLE 類型固定占用8個字節(64位),并且需要一位表示符號,11位表示指數,2的52次方-1:2^53 = 9007199254740992,當輸入的數值大于9007199254740992時,存在數值溢出 。

也就是當數字超過16位以后,數據庫不會報錯,而是溢出后轉為最接近的值入庫,如下圖:設置字段類型為double型,9007199254740993入庫后顯示為9007199254740992。

并且如下圖測試,溢出入庫的數據轉化后有某種沒明顯規律的規則:

同理,取數據時,大于9007199254740992的數值也會發生轉換,如下圖,9007199254740993可以檢索出9007199254740992的數值:

所以Bug產生過程為:18位數值類型 為double類型(1.003202010001958E+18),數據庫查詢時將business_no 變成(1.003202010001958E+18),數據庫存的business_no值也根據隱式類型轉換原則也轉為了double類型。最終,過濾末尾兩位的數值相等。

至此,對不同字符產生的隱式類型轉換 和過程中轉 double 型、數值溢出問題都有了更新的認知。

三、從表象 bug 展開的測試點思考

1. 反向思考

以上是字符型字段導入數值型的案例,因為字符型存的也是數值,因此在未超過 16位的查詢上,不會有其他異常,但如果是數值型字段導入字符型字段呢?

如下圖測試所示:

插入 id=0 的數據后,查詢 id=a 可以查詢出 id=0 的數據。

原來 mysql 的隱式轉換,在 int 類型的字段傳入字符串會截取從第一位 int 型開始到第一個非 int 型的值作為條件。因為 a 沒有 int 值,所以等于 0,最終查詢 id=a 可以查詢出 id=0 的數據。

特別注意:如果傳入字符串為 01e2 ,則可以查詢出 100。

2. 針對隱式轉換的 bug,之后如何優化用例測試點,做主動防范,提高測試覆蓋率?

(1) 功能問題考慮:

表單校驗:使用不同于數據庫設計類型的數據來進行測試,如數據庫數值型,則用字符型數據測試,字符型數據用 0 或&等數值運算符測試,從源頭盡量過濾不一致。

對于非 web 錄入的源頭或者后臺程序代碼看不到的類型轉換的問題,可以使用多個超過 16 位的臨近數、以及根據隱式轉換規則轉換后值一致的字符串進行數據鋪底,測試點包括所有涉及后臺查詢的場景。在我們保險軟件測試中,因為單證號是非常重要的基本數據,因此特別要注意超過 16 位的保單號、投保單等單證的鋪底準備。

除此外,關注數值統計、時間比較的業務場景,因為涉及時間和數值統計時經常需要函數進行轉換,此時如果格式不一致也會發生隱式轉換的問題:如date( a.publish_time ) >= date_sub( curdate(), INTERVAL 1 DAY )

Date 顯示格式:YYYY-MM-DD;DateTime 顯示格式:YYYY-MM-DD HH:mm:ss。

所以 2008-12-27 16:25:46.635 經過 dat(e )函數處理后的時間為:2008-12-27 ,date_sub時間值精確到秒,因此發生隱式轉換后,date()會轉成 2008-12-27 0:0:0,時間范圍上變窄。

數據庫存在NULL值時,需要特別關注。因為當兩個參數至少有一個是 NULL 時,比較的結果也是 NULL。

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2009-08-28 11:03:17

C#長整型數據

2022-11-27 23:30:48

H5小程序HTML

2010-07-19 09:40:59

SQL Server數

2019-09-06 08:22:20

MySQL數據庫索引

2017-12-20 14:14:16

數據庫MySQL數據類型

2022-08-03 08:48:45

測試時間功能

2009-07-21 13:54:55

Scala重載方法隱式轉換

2009-09-04 10:49:19

C#隱式轉換

2011-03-23 09:54:47

數據模型數據庫設計

2011-03-22 14:57:52

Oracle數據庫普通表分區表

2023-10-08 16:28:36

數據庫DuckDB

2009-07-20 14:03:43

Ado.net連接池

2010-09-09 11:02:36

SQL函數IP

2022-06-08 09:11:55

測試代碼開發

2013-04-26 16:18:29

大數據全球技術峰會

2020-08-06 10:25:30

數據庫MySQLjoin

2013-11-29 09:58:27

巨彬軟件NoSQL文檔型數據庫

2018-06-07 08:31:33

Oracle分布式內存

2022-05-31 07:58:49

TiDB數據庫開源

2018-05-07 09:30:41

數據庫NoSQLNewSQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 羞羞的视频在线看 | 亚洲成人av | 色网站入口 | 福利片一区二区 | 国产成人综合久久 | 成人福利视频 | 影音先锋亚洲资源 | 91麻豆精品国产91久久久更新资源速度超快 | 国产福利视频 | 精久久久| 亚洲一区中文字幕 | 欧美成人一区二区三区 | jdav视频在线观看免费 | 9久久精品 | 欧美在线a| 国产精品国产亚洲精品看不卡15 | 欧美一区二区三区 | 一区免费观看 | 日韩一级欧美一级 | 亚洲精品黄色 | 深爱激情综合 | 亚洲人的av | 亚洲午夜一区二区 | 亚洲视频一区 | 91成人免费看 | 欧美日韩网站 | 伊人久久精品 | 久久精品 | 天堂av免费观看 | 青青草原综合久久大伊人精品 | av免费观看网站 | 日韩一区二区视频 | 久久久久国 | 国产日韩欧美另类 | 成人激情视频免费观看 | 在线欧美a| 国产精品久久久久久久久久久久 | www.日韩| 91精品国产一区二区三区香蕉 | 日屁网站 | 亚洲精品一区二区三区中文字幕 |