天天看點

在測試MySQL腳本時所遇到的問題

近期,筆者在做MySQL腳本的移植和測試工作。在此過程中,發現了MySQL資料庫所存在的一些有待優化的地方,特寫下此文,供相關項目的開發人員參考。

一、存儲過程中所使用的參數名錯誤的問題

例如,在MySQL資料庫中建立如下表tb_testnum:

同時,建立如下存儲過程pr_dealtestnum:

注意,“select count(*) into p_boxnumcount from tb_testnum where boxnumber=p_boxnumbe;”語句中的參數“p_boxnumbe”與輸入參數“p_boxnumber”不一樣(少了一個r),該參數未在存儲過程中定義。

将存儲過程pr_dealtestnum放到pr_dealtestnum.sql檔案中,使用指令行運作該腳本檔案,發現MySQL資料庫居然不報錯:

接着,在MySQL資料庫上調用該存儲過程時報錯,提示“p_boxnumbe”不存在:

這樣,問題就出現了,難道MySQL資料庫對存儲過程中所使用的參數名的檢查不嚴格?

二、存儲過程中所使用的參數名前面存在多餘符号的問題

這個問題和第一個問題類似,隻是“參數名錯誤”變成了“在參數名前面有多餘的符号”。

例如,我們還是使用問題一中的表tb_testnum,并在表中插入資料:

注意,“select count(*) into p_boxnumcount from tb_testnum where boxnumber=@p_boxnumber;”語句中的參數“@p_boxnumber”是在輸入參數“p_boxnumber”的前面添加了@符号。

接着,在MySQL資料庫上調用該存儲過程時無報錯,但是輸出的結果不正确:

因為我們在前面已經向表tb_testnum中插入了一條資料,是以正确的輸出應該是1,而不是0。

我們将“select count(*) into p_boxnumcount from tb_testnum where boxnumber=@p_boxnumber;”語句中的“@p_boxnumber”中的@符号去掉,再放到MySQL資料庫中運作,發現執行“call pr_dealtestnum(‘2344273522’);”之後輸出的結果就是正确的了。

這也說明了MySQL資料庫對存儲過程中所使用的參數名的檢查不嚴格。

三、存儲過程中向表中插入多餘資料的問題

例如,我們還是使用前面兩個問題中的表tb_testnum,如果直接向表中插入多餘的資料,則MySQL資料庫會報錯:

報錯的原因是表tb_testnum隻有兩列,但是欲向其中插入三列資料。

接着,建立如下存儲過程pr_dealtestnum:

注意,“insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype,1);”語句中表的列數和插入資料的列數不一緻。

然後,在MySQL資料庫上調用該存儲過程時報錯,提示列不比對:

這樣,又一個問題出現了,難道MySQL資料庫對存儲過程中的資料插入語句不判斷前後列數是否比對?

四、存儲過程中的select語句的編寫問題

例如,我們還是使用前面的表tb_testnum,并建立如下存儲過程pr_dealtestnum:

注意,“select p_boxnumcount=count() from tb_testnum where boxnumber=p_boxnumber;”語句是不符合MySQL文法規則的,正确的語句應該是“select count() into p_boxnumcount from tb_testnum where boxnumber=@p_boxnumber;”。

然後,在MySQL資料庫上調用該存儲過程,輸出結果如下:

以上結果與我們預期的結果相差甚遠。

這樣,又一個問題出現了,難道MySQL資料庫對存儲過程中的每條語句不作嚴格的文法校驗?

五、存儲過程中取整數值的問題

例如,我們建立如下存儲過程pr_calculate:

在此存儲過程中,我們想把“(p_intnum1+p_intnum2)/10*10”結果賦給整型變量p_result。

将存儲過程pr_calculate放到pr_calculate.sql檔案中,使用指令行運作該腳本檔案,結果如下:

以上輸出結果與我們的預期不相符,如對于“call pr_calculate(2,9);”,參數傳進去之後,表達式的值為“set p_result = (2+9)/10*10;”,按照以往的經驗,“(2+9)/10*10”的結果應該為10,即“(2+9)/10”應該為1,但是在MySQL中,該表達式的值卻為11。

這說明了在MySQL資料庫中,對于整型變量的計算規則有所不同。

六、“四舍五入”的問題

例如,直接在MySQL資料庫上執行如下語句:

可以看到,因為“8/6”小于1.5,是以對其取整後的值就為1;而因為“9/6”等于1.5,是以對其取整後的值就為2。這也可以看出,在将小數轉換為整數的過程中,MySQL資料庫遵循的是“四舍五入”的原則。

七、總結

MySQL作為一款廣受歡迎的開源資料庫,目前已被很多中小網站采用,在資料庫市場上占據了25%以上的市場佔有率。但是,如在本文中所描述的那樣,MySQL也并非是十全十美的。

期待MySQL會不斷進行優化,讓更多的軟體産品來使用它。