日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在測試MySQL腳本時所遇到的問題

近期,筆者在做MySQL腳本的移植和測試工作。在此過程中,發(fā)現(xiàn)了MySQL數(shù)據(jù)庫所存在的一些有待優(yōu)化的地方,特寫下此文,供相關(guān)項目的開發(fā)人員參考。

站在用戶的角度思考問題,與客戶深入溝通,找到南部網(wǎng)站設(shè)計與南部網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋南部地區(qū)。

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

例如,在MySQL數(shù)據(jù)庫中新建如下表tb_testnum:

 
 
  1. drop table if exists tb_testnum;
  2. create table tb_testnum
  3. (
  4.     boxnumber         varchar(30)          not null,
  5.     usertype          int                  not null                                                                                  
  6. );
  7. create unique index idx1_tb_testnum on tb_testnum(boxnumber);

同時,創(chuàng)建如下存儲過程pr_dealtestnum:

 
 
  1. drop procedure if exists pr_dealtestnum;
  2. delimiter //
  3. create procedure pr_dealtestnum
  4. (
  5.     in    p_boxnumber    varchar(30)
  6. )
  7. pr_dealtestnum_label:begin
  8.     declare   p_boxnumcount    int;
  9.     select count(*) into p_boxnumcount from tb_testnum where boxnumber=p_boxnumbe;
  10.     select p_boxnumcount;
  11.     leave pr_dealtestnum_label;
  12. end;
  13. //
  14. delimiter ;
  15. select 'create procedure pr_dealtestnum ok';

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

將存儲過程pr_dealtestnum放到pr_dealtestnum.sql文件中,使用命令行運行該腳本文件,發(fā)現(xiàn)MySQL數(shù)據(jù)庫居然不報錯:

 
 
  1. > mysql -uroot -p'root' -h10.10.10.10 -P3306 -Ddbtest
  2. create procedure pr_dealtestnum ok
  3. create procedure pr_dealtestnum ok

接著,在MySQL數(shù)據(jù)庫上調(diào)用該存儲過程時報錯,提示“p_boxnumbe”不存在:

 
 
  1. mysql> call pr_dealtestnum('2344273522');
  2. ERROR 1054 (42S22): Unknown column 'p_boxnumbe' in 'where clause'

這樣,問題就出現(xiàn)了,難道MySQL數(shù)據(jù)庫對存儲過程中所使用的參數(shù)名的檢查不嚴格?

二、存儲過程中所使用的參數(shù)名前面存在多余符號的問題

這個問題和***個問題類似,只是“參數(shù)名錯誤”變成了“在參數(shù)名前面有多余的符號”。

例如,我們還是使用問題一中的表tb_testnum,并在表中插入數(shù)據(jù):

 
 
  1. insert into tb_testnum(boxnumber,usertype) values('2344273522',1);11

同時,創(chuàng)建如下存儲過程pr_dealtestnum:

 
 
  1. drop procedure if exists pr_dealtestnum;
  2. delimiter //
  3. create procedure pr_dealtestnum
  4. (
  5.     in    p_boxnumber    varchar(30)
  6. )
  7. pr_dealtestnum_label:begin
  8.     declare   p_boxnumcount    int;
  9.     select count(*) into p_boxnumcount from tb_testnum where boxnumber=@p_boxnumber;
  10.     select p_boxnumcount;
  11.     leave pr_dealtestnum_label;
  12. end;
  13. //
  14. delimiter ;
  15. select 'create procedure pr_dealtestnum ok';

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

將存儲過程pr_dealtestnum放到pr_dealtestnum.sql文件中,使用命令行運行該腳本文件,發(fā)現(xiàn)MySQL數(shù)據(jù)庫居然不報錯:

 
 
  1. > mysql -uroot -p'root' -h10.10.10.10 -P3306 -Ddbtest
  2. create procedure pr_dealtestnum ok 
  3. create procedure pr_dealtestnum ok123123

接著,在MySQL數(shù)據(jù)庫上調(diào)用該存儲過程時無報錯,但是輸出的結(jié)果不正確:

 
 
  1. mysql> call pr_dealtestnum('2344273522');
  2. +---------------+
  3. | p_boxnumcount |
  4. +---------------+
  5. |             0 |
  6. +---------------+
  7. 1 row in set (0.00 sec)
  8. Query OK, 0 rows affected (0.00 sec)

因為我們在前面已經(jīng)向表tb_testnum中插入了一條數(shù)據(jù),所以正確的輸出應(yīng)該是1,而不是0。

我們將“select count(*) into p_boxnumcount from tb_testnum where boxnumber=@p_boxnumber;”語句中的“@p_boxnumber”中的@符號去掉,再放到MySQL數(shù)據(jù)庫中運行,發(fā)現(xiàn)執(zhí)行“call pr_dealtestnum(‘2344273522’);”之后輸出的結(jié)果就是正確的了。

這也說明了MySQL數(shù)據(jù)庫對存儲過程中所使用的參數(shù)名的檢查不嚴格。

三、存儲過程中向表中插入多余數(shù)據(jù)的問題

例如,我們還是使用前面兩個問題中的表tb_testnum,如果直接向表中插入多余的數(shù)據(jù),則MySQL數(shù)據(jù)庫會報錯:

 
 
  1. mysql> insert into tb_testnum(boxnumber,usertype) values('2344273523',1,1);
  2. ERROR 1136 (21S01): Column count doesn't match value count at row 1

報錯的原因是表tb_testnum只有兩列,但是欲向其中插入三列數(shù)據(jù)。

接著,創(chuàng)建如下存儲過程pr_dealtestnum:

 
 
  1. drop procedure if exists pr_dealtestnum;
  2. delimiter //
  3. create procedure pr_dealtestnum
  4. (
  5.     in    p_boxnumber    varchar(30),
  6.     in    p_usertype     int
  7. )
  8. pr_dealtestnum_label:begin
  9.     insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype,1);
  10.     leave pr_dealtestnum_label;
  11. end;
  12. //
  13. delimiter ;
  14. select 'create procedure pr_dealtestnum ok';

注意,“insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype,1);”語句中表的列數(shù)和插入數(shù)據(jù)的列數(shù)不一致。

將存儲過程pr_dealtestnum放到pr_dealtestnum.sql文件中,使用命令行運行該腳本文件,發(fā)現(xiàn)MySQL數(shù)據(jù)庫居然不報錯:

 
 
  1. > mysql -uroot -p'root' -h10.10.10.10 -P3306 -Ddbtest
  2. create procedure pr_dealtestnum ok
  3. create procedure pr_dealtestnum ok

然后,在MySQL數(shù)據(jù)庫上調(diào)用該存儲過程時報錯,提示列不匹配:

 
 
  1. mysql> call pr_dealtestnum('2344273523',1); 
  2. ERROR 1136 (21S01): Column count doesn't match value count at row 11212

這樣,又一個問題出現(xiàn)了,難道MySQL數(shù)據(jù)庫對存儲過程中的數(shù)據(jù)插入語句不判斷前后列數(shù)是否匹配?

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

例如,我們還是使用前面的表tb_testnum,并創(chuàng)建如下存儲過程pr_dealtestnum:

 
 
  1. drop procedure if exists pr_dealtestnum;
  2. delimiter //
  3. create procedure pr_dealtestnum
  4. (
  5.     in    p_boxnumber    varchar(30)
  6. )
  7. pr_dealtestnum_label:begin
  8.     declare   p_boxnumcount    int;
  9.     select p_boxnumcount=count(*) from tb_testnum where boxnumber=p_boxnumber;
  10.     select p_boxnumcount;
  11.     leave pr_dealtestnum_label;
  12. end;
  13. //
  14. delimiter ;
  15. select 'create procedure pr_dealtestnum ok';

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

將存儲過程pr_dealtestnum放到pr_dealtestnum.sql文件中,使用命令行運行該腳本文件,發(fā)現(xiàn)MySQL數(shù)據(jù)庫居然不報錯:

 
 
  1. > mysql -uroot -p'root' -h10.10.10.10 -P3306 -Ddbtest
  2. create procedure pr_dealtestnum ok 
  3. create procedure pr_dealtestnum ok123123

然后,在MySQL數(shù)據(jù)庫上調(diào)用該存儲過程,輸出結(jié)果如下:

 
 
  1. mysql> call pr_dealtestnum('2344273522');
  2. +------------------------+
  3. | p_boxnumcount=count(*) |
  4. +------------------------+
  5. |                   NULL |
  6. +------------------------+
  7. 1 row in set (0.00 sec)
  8. +---------------+
  9. | p_boxnumcount |
  10. +---------------+
  11. |          NULL |
  12. +---------------+
  13. 1 row in set (0.00 sec)
  14. Query OK, 0 rows affected (0.00 sec)

以上結(jié)果與我們預(yù)期的結(jié)果相差甚遠。

這樣,又一個問題出現(xiàn)了,難道MySQL數(shù)據(jù)庫對存儲過程中的每條語句不作嚴格的語法校驗?

五、存儲過程中取整數(shù)值的問題

例如,我們創(chuàng)建如下存儲過程pr_calculate:

 
 
  1. drop procedure if exists pr_calculate;
  2. delimiter //
  3. create procedure pr_calculate
  4. (
  5.     in    p_intnum1    int,
  6.     in    p_intnum2    int
  7. )
  8. pr_calculate_label:begin
  9.     declare   p_result    int;
  10.     set p_result = (p_intnum1+p_intnum2)/10*10;
  11.     select p_result;
  12.     leave pr_calculate_label;
  13. end;
  14. //
  15. delimiter ;
  16. select 'create procedure pr_calculate ok';

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

將存儲過程pr_calculate放到pr_calculate.sql文件中,使用命令行運行該腳本文件,結(jié)果如下:

 
 
  1. > mysql -uroot -p'root' -h10.10.10.10 -P3306 -Ddbtest
  2. create procedure pr_calculate ok 
  3. create procedure pr_calculate ok123123

然后,在MySQL數(shù)據(jù)庫上調(diào)用該存儲過程,輸出結(jié)果如下:

 
 
  1. mysql> call pr_calculate(2,1);
  2. +----------+
  3. | p_result |
  4. +----------+
  5. |        3 |
  6. +----------+
  7. 1 row in set (0.00 sec)
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql> call pr_calculate(2,3);
  10. +----------+
  11. | p_result |
  12. +----------+
  13. |        5 |
  14. +----------+
  15. 1 row in set (0.00 sec)
  16. Query OK, 0 rows affected (0.00 sec)
  17. mysql> call pr_calculate(2,6);
  18. +----------+
  19. | p_result |
  20. +----------+
  21. |        8 |
  22. +----------+
  23. 1 row in set (0.00 sec)
  24. Query OK, 0 rows affected (0.00 sec)
  25. mysql> call pr_calculate(2,9);
  26. +----------+
  27. | p_result |
  28. +----------+
  29. |       11 |
  30. +----------+
  31. 1 row in set (0.00 sec)
  32. Query OK, 0 rows affected (0.00 sec)
  33. mysql> call pr_calculate(2,8);
  34. +----------+
  35. | p_result |
  36. +----------+
  37. |       10 |
  38. +----------+
  39. 1 row in set (0.00 sec)
  40. Query OK, 0 rows affected (0.00 sec)
  41. mysql> call pr_calculate(3,13);
  42. +----------+
  43. | p_result |
  44. +----------+
  45. |       16 |
  46. +----------+
  47. 1 row in set (0.00 sec)
  48. Query OK, 0 rows affected (0.00 sec)

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

這說明了在MySQL數(shù)據(jù)庫中,對于整型變量的計算規(guī)則有所不同。

六、“四舍五入”的問題

例如,直接在MySQL數(shù)據(jù)庫上執(zhí)行如下語句:

 
 
  1. mysql> select convert(8/6, signed);
  2. +----------------------+
  3. | convert(8/6, signed) |
  4. +----------------------+
  5. |                    1 |
  6. +----------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> select convert(9/6, signed);
  9. +----------------------+
  10. | convert(9/6, signed) |
  11. +----------------------+
  12. |                    2 |
  13. +----------------------+
  14. 1 row in set (0.00 sec)

可以看到,因為“8/6”小于1.5,所以對其取整后的值就為1;而因為“9/6”等于1.5,所以對其取整后的值就為2。這也可以看出,在將小數(shù)轉(zhuǎn)換為整數(shù)的過程中,MySQL數(shù)據(jù)庫遵循的是“四舍五入”的原則。

七、總結(jié)

MySQL作為一款廣受歡迎的開源數(shù)據(jù)庫,目前已被很多中小網(wǎng)站采用,在數(shù)據(jù)庫市場上占據(jù)了25%以上的市場份額。但是,如在本文中所描述的那樣,MySQL也并非是十全十美的。

期待MySQL會不斷進行優(yōu)化,讓更多的軟件產(chǎn)品來使用它。

【本文是專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】


新聞名稱:在測試MySQL腳本時所遇到的問題
文章網(wǎng)址:http://www.dlmjj.cn/article/cceoojg.html