Mysql ფუნქციების აღწერა და აპლიკაცია. ივარჯიშეთ MySQL count ფუნქციის გამოყენებით. შენახული პროცედურებისა და ფუნქციების სინტაქსი

3.1 dPVBCHMEOYE OPCHCHI ZHKHOLGYK CH MySQL

eUFSH DCHB URPUPVB DPVBCHYFSH OPCHHA ZHOLGYA CH MySQL:

  • CHSC NPTSEFE DPVBCHYFSH ZHKHOLGYA YUETE UNBUDDY PREDEMENSCHI RPMSHЪPCHBFEMEN ZHKHOLGYK (მომხმარებლის მიერ განსაზღვრული ფუნქცია, UDF). p_y DPVBCHMSAFUS DYOBNYUEULY, YURPMSHЪHS LPNBODSCH CREATE FUNCTION Y DROP FUNCTION . RPDTPVOPUFY CH TBDEME " ".
  • CH NPTSEFE DPVBCHYFSH ZHKHOLGYA LBL CHOKHFTEOOAA CH MySQL. fBLYE ZHOLGYY LPNRYMYTHAFUS RTSNP CHOKHFTSH UETCHETB mysqld Y UFBOPCHSFUS DPUFHROSCHNIY RPUFPSOOPK PUOPCHE-ს შესახებ.

LBTSDSCHK NEFPD YNEEF UCHPY RTPVMENSH:

  • EUMY CHCH RYIEFE PRTEDEMSENKHA RPMSHЪPCHBFEMEN ZHKHOLGYA, CHCH DPMTSOSCH KHUFBOPCHYFSH PVAELFOSHCHK ZHBKM CH DPRPMOEOYE L UETCHETKH. eUMY chsch LPNRYMYTHEFE chBIKH ZHKHOLGYA RTSNP CH VITCHET, chsch OE DPMTSOSCH DEMBFSH LFZP.
  • CHCH NPTSEFE DPVBCHMSFSH UDF L DCHPYUOPNH DYUFTYVHFYCHH MySQL. CHUFTPEOOOSCH ZHKHOLGYY FTEVHAF, YuFPVSC CHCH YЪNEOMY YUIPDOYLY.
  • EUMY CH PVOPCHMSEFE MySQL, CH NPSEFE RTDPDPMTSBFSH YURPMSHЪPCHBFSH hBI RTEDCHBTYFEMSHOP HUFBOPCHMEOOOSCHK UDF. DMS CHUFTPEOOCHI ZHKHOLGYK chshch DPMTSOSCH RPCHFPTYFSH NPDYZHYLBGYY LBTSDSCHK TB, LPZDB chsch DEMBEFE BRZTEKD.

oEBCHYUYNP PF NEFPDB, LPFPTSCHK CHCH YURPMSHЪHEFE, YUFPVSH DPVBCHYFSH OPCHSHE ZHKHOLGYY, PIY NPZHF YURPMSHЪPCHBFSHUS FPYuOP FBL FBL SHKHOLGYY.

3.1.1 UYOFBLYU CREATE FUNCTION/Drop FUNCTION

CREATE FUNCTION function_name RETURNS (STRING|REAL|INTEGER) SONAME shared_library_name DROP FUNCTION function_name

PRTEDEMSENSCH RPMSHЪPCHBFEMEN ZHOLGYY (მომხმარებლის მიერ განსაზღვრული ფუნქცია, UDF) RTEDUFBCHMSAF UPVPK URPUPV TBUYTYFSH ZHOLGYSN MySQL FRB ABS() YMY CONCAT() .

AGGREGATE OPCHBS PRGYS DMS MySQL ვერსია 3.23. zHOLGYS U AGGREGATE TBVPFBEF FPYUOP FBL CE, LBL Y CHUFTPEOOBS ZHOLGYS GROUP , RPDPVOP SUM YMY COUNT() .

ფუნქციის შექმნა UPITBOSEF YNS ZHOLGYY, FYR Y PVEEDPUFHROPE VYVMYPFEYOOPE YNS CH FBVMYGE mysql.func UYUFENSCH. CHCH DPMTSOSCH YNEFSH RTYCHYMEZYY ჩასმაწაშლა DMS VBSH DBOSHI mysql, YuFPVSH UPЪDBCHBFSH Y KHDBMSFSH ZHKHOLGYY.

Chue BLFFYCHOSCHE ZHKHOLGYY RETEЪBZTHTSBAFUS RTY LBTSDPN ЪBRHULE UETCHETB, EUMY CHCH OE ЪBRHULBEFE mysqld U PRGYEK --skip-grant-tables . h LFPN UMKHYUBE YOYGYBMYBGYS RTPRHEEOB, Y UDF UFBOKHF OEDPUFHROSCH. BLFYCHOBS ZHOLGYS RTEDUFBCHMSEF UPVPK FBLHA ZHOLGYA, LPFPTBS VSHMB UBZTHCEOB U RPNPESHU CREATE FUNCTION, OP OE VSHMB KHDBMEOB YUETE CHCHCH

RP RPCHPDH RTBCHYM OBRYUBOYS PRTEDEMESNSHI RPMSHЪPCHBFEMEN ZHKHOLGYK PFUSCHMBA CHBU L TBDEMH "3.1 dPVBCHMEOYE OPChPK ZHKHOLGYSH, PRTED dMS TBVDFYHPMSH FSH OBR YUBOSCH PRO C YMY C++, schob PRTBGYPOOBS UYUFENB DPMTSOB RPDDETTSYCHBFSH DYOBNYU VSHFSH PFLPNRYMYTPCHBO DYOBNYUEULY (OE UFBFYUEULY).

3.1.2 dPVBCHMEOYE OPChPK ZHKHOLGYY, PRTEDEMSENPK RPMSHЪPCHBFEMEN

dMS TBVPFSH NEIBOYNB UDF ZHKHOLGYY DPMTSOSCH VSHFSH OBRYUBOSCH PRO C YMY C++, B chBIB PRETBGYPOOBS UYUFENB DPMTSOB RPDDETSYCHBFSH DYOBNYU. dYUFTYVHFYCH YUIPDOYLPCH MySQL CHLMAYUBEF ZBKM sql/udf_example.cc , LPFPTSHCHK PRTEDEMSEF 5 OPCHSHCHI ZHKHOLGYK. lPOUKHMSHFYTHKFEUSH U FYN ZHBKMPN, YUFPVSHCHYDEFSH, LBL TBVPFBAF UPZMBIEOYS P CHSHCHPCHBI UDF.

yuFPVShch mysqld NPZ YURPMSHЪPCHBFSH UDF, chShch DPMTSOSCH LPOZHYZHTYTPCHBFSH MySQL U PRGYEK --mysqld-ldflags=-rdynamic . RTYYUYOB LFPPZP CH FPN, YuFP PRO NOPZY RMBFZHTNBI (CHLMAYUBS Linux) CHSC NPTSEFE ЪBZTHTSBFSH DYOBNYYUEULHA VYVMYPFELH OPK RTPZTBNNSHCH, LPFBPTBS -MyqWild-s --s სტატიკური YURPMSHЪPCHBFSH UDF, LPFPTSCHK DPMTSEO PVTBFYFSHUS L UINCHPMBN YЪ mysqld ( RPDPVOP RTYNETH მეტაფონი sql/udf_example.cc NRPOPCHBFSH RTPZTBNNH U-rdynamic.rPDTPVOPUFY PRO man dlopen.

DMS LBTSDPK ZHKHOLGYY, LPFPTHA CHSH ІПФФИFE YURPMSHЪPCHBFSH CH YOUFTHLGYSІ SQL, CHSH DPMTSOSCH PRTEDEMYFSH UPPFCHEFUFCHHAEHA ZHOLY h `PVUKYxHPMS" NEOY ZHKHOLGYY RTYNETB. 'DEUSH XXX() (CHETIOYK TEZYUFT) KHLBSHCHCHBEF SQL-PVTBEOOYE L ZHKHOLYY, Y xxx() (OYTSOYK TEZYUFT) KHLBSHCHCHBEF C/C++-PVTBEEOYE L ZHKHOLY

zHOLGYY, LPFPTSHCHCH RIEFE PRO C/C++ DMS TEBMYBGYY YOFETZHEKUB U XXX() :

Xxx() (PVSBFEMSHOB) pOOPCHOBS JHOLGYS. LFP FP NEUFP, TUD ZHOLGYPOBMSHOSCHK TEKHMSHFBF CHCHYUYUMEO. UPPFCHEFUFCHYE NETSDH FYRPN SQL Y FYRPN CHP'ChTBFB chBIEK ZHOLGYY PRO C/C++ RPLB'SCHBEFUS OJCE:

SQL-FYR C/C++-FIP
STRINGchar *
მთელიგრძელი გრძელი
რეალურიორმაგი
xxx_init() (PRGYPOBMSHOB) zHOLGYS YOYGYBMYBGYY DMS xxx() . 'FP NVCEF YURPMSHЪPCHBFSHUS DMS:
  • rTPCHETLI YUYUMB RBTBNEFTPCH XXX() .
  • RTPCHETLY, YuFP RBTBNEFTSCH YNEAF FTEVKHENSHCHK FYR YMY CHSHCHDBYUY RTEDRYUBOIS, YuFPVSH MySQL RTYOHDYFEMSHOP RTYCHEM RBTBNEFTSCH L FIRBN, LFF PUCHOLBOCHOBSCH.
  • TBURTEDEMEOYS MAVPK RBNSFSH, FTEVKHENPK DMS PUOPCHOPK ZHKHOLGYY.
  • pRTEDEMEOYS NBLUINBMSHOPK DMYOSCH TEKHMSHFBFB.
  • HLBBOYS (DMS ZHOLGYK FYRB REAL) NBLUINBMSHOPZP LPMYUEUFCHB DEUSFYUOSCHI YUYUEM.
  • хЛБЪBOYS FPZP, NVTSEF YMY OEF TEЪХМШФБФ ВШЧФШ NULL .
xxx_deinit() (PRGYPOBMSHOP) JHOLGYS DEIOYGYBMYBGYY DMS xxx() . LFP DPMTSOP PUCHPVPDYFSH MAVHA RBNSFSH, TBURTEDEMOOHA ZHOLGYEK YOYGYBMYBGYY.

lPZDB YOUFTHLGYS SQL CHSHCHCHCHBEF XXX() , MySQL CHSHCHCHCHBEF JHOLGYA YOYGYBMYBGYY xxx_init() , YUFPVSH RPJCHPMYFSH EK CHSHCHRPXNEETLYFTEBYDYT ი. eUMMY xxx_init() CHPCHTBEBEF PIYVLH, YOUFTHLGYS SQL VHDEF RTETCHBOB U UPPVEEOYEN PV PIVLE, RTYYUEN ZMBCHOBS Y DEYOYGYBMYBGYPOBH JH YF YNEFHMEHDEF RTETCHBOB YOBYU PUOPCHOBS ZHOLGYS xxx() VKhDEF CHSHCHBOB PDYO TB DMS LBTsDPK UFTPLY. RPUME FPZP, LBL CHUE UFTPLY VSHCHMY PVTBVPFBOSHCH, CHSCCHCHBEFUS ZHOLGYS xxx_deinit(), FBL UFP POB NPTSEF CHSHCHRPMOYFSH FTEVKHENHA PYUYUFLH.

Chue Zholgyy DPMTSOSCH SHFSH VE'PRBUOSCH DMS RPFPPCH (OE FPMSHLP Puopchobs Zhholgys, OP Pufbmshchina: Yoigybmybgypide Yaroigyibyyyifimey!). LFP P'OBYUBEF, YuFP chBN OE RPJCHPMSF TBURTEDEMYFSH MOVSHHE ZMPVBMSHOSHE YMY NEOSFSH UFBFYUYUULYE RETENEOOOSCH! eUMY CHCH OHTSDBEFEUSH CH RBNSFY, CHCH DPMTSOSCH TBURTEDEMYFSH ЇЇ CH xxx_init() Y OERTENEOOOP PUCHPVPDYFSH CH xxx_deinit() .

3.1.2.1 UPZMBIOYOS RP CHShCHPCHH UDF

PUOPCHOBS ZHOLGYS DPMTSOB VSHFSH PVYASCHMEOB LBL RPLBOBOP OJCE. PVTBFYFE CHOYNBOYE, UFP FYR PP'ChTBFB Y RBTBNEFTSH PFMYUBAFUS CH BCHYUINPUFY PF FPZP, PVYASCHYFE MY CHSH FYR PP'CHTBFB ZHOLGYY SQRATE XXX:

DMS ZHOLGYK FYRB STRING:

Char *xxx(UDF_INIT *initid, UDF_ARGS *args, char *შედეგი, ხელმოუწერელი გრძელი *სიგრძე, char *is_null, char *error);

DMS ZHOLGYK FYRB მთელი:

გრძელი გრძელი xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);

DMS ZHOLGYK FYRB REAL:

Double xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);

ZKHOLGYY YOYGYBMYBGYY Y DEYOYGYBMYBGYY PVYASCHMEOSCH RPDPVOP LFPNH:

My_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void xxx_deinit(UDF_INIT * initid);

rBTBNEFT initid RETEDBO CHUEN FTEN ZHOLGYSN. KHLBYSHCHBEF-ის მიერ UFTHHLFHTH UDF_INIT-ის შესახებ, LPFPTBS YURPMSH'HEFUS, YUFPVSH RETEDBFSH YOZHPTNBGYA NETSDH ZHOLGYSNY. yuMEOSCH UFTHHLFHTSCH UDF_INIT RETEIUMEOSH OJCE. zHOLGYS YOYGYBMYBGYY DPMTSOB ЪBRPMOYFSH MAVSCHE YUMEOSCH, LPFPTSHCHE POB TSEMBEF YЪNEOYFSH. YuFPVSH YURPMSHЪPCHBFSH OBYUEOYE RP KHNPMYUBOYA DMS YUMEOB, PUFBCHSHFE EZP OEYJNEOOCHN. RETKDEN L PRJUBOYA:

My_bool maybe_null xxx_init() DPMTSOB KHUFBOPCHYFSH შესაძლოა_null CH 1, EUMY xxx() NVCEF CHPTBEBFSH NULL . OBUЄОЄ RP KHNPMYUBOYA 1, EUMY MAVPK YЪ RBTBNEFTPPCH PVIASCHMEO LBL შესაძლოა_null. ხელმოუწერელი int ათწილადები yuYUMP DEUSFYUOSCHI GYZHT. RP KHNPMYUBOYA-ს ობიექტი: NBLUINBMSHOPE LPMYUEUFCHP DEUSFYUOSCHI GYZhT CH RBTBNEFTBI, RETEDBOOSCHI PUOPCHOPK ZHKHOLGYY. OBRTYNET, EUMY ZHOLGYY RETEDBOSHCH 1.34 , 1.345 Y 1.3 , OBYUEOYEN RP KHNPMYUBOYA VHDEF 3, RPULPMSHLH 1.345 YNEEF 3 DEUSFYU ხელმოუწერელი DEUSFYU 1.345 Y 1.3 -უფთლად. 'OBYUEOE RP KHNPMYUBOYA PFMYUBEFUS CH UBCHYUYNPUFY PF FYRB TE'KHMSHFBFB ZHKHOLGYY. DMS UFTPUOSCHI ZHOLGYK OBYUEOYE RP KHNPMYUBOYA TBCHOP DMYOE UBNPZP DMYOOOPZP RBTBNEFTB. DMS GEMPYUYUMEOOCHI ZHOLGYK OBYUEOYE RP KHNPMYUBOYA UPPFCHEFUFCHHEF 21 GIJTE. dMS TEBMSHOSCHI ZHOLGYK 'OBYUOE RP KHNPMYUBOYA 13+LPMYUUEUFCHP DEUSFYUOSCHI YUYUEM, PVP'OBYUOOOCHI LBL initid->ათწილადები . DMS YUYUMPCHSHCHI ZHKHOLGYK DMYOB CHLMAYUBEF MAVPK OBBL YMY DEUSFYUOSHE UYNCHPMSCH PFNEFLY. char *ptr хLBЪБFEMSH, LPFPTSCHK ZHOLGYS NVCEF YURPMSHЪPCHBFSH DMS UPVUFCHOOOCHI GEMEK. OBRTYNET, ZHKHOLGYY NPZHF YURPMSHЪPCHBFSH initid->ptr, YUFPVSH RETEDBFSH TBURTEDEMOOKHA RBNSFSH NETSDH ZHKHOLGYSNY. h xxx_init() LBL PVSHYUOP TBURTEDEMYFE RBNSFSH Y OB'YABLENYA ЇЇ ьФПНХ ХЛБББФЭМА: initid->ptr=გამოყოფილი_მეხსიერება; h xxx() Y xxx_deinit() PVTBFYFEUSH L initid->ptr , YuFPVSH YURPMSHЪPCHBFSH YMY PUCHPVPDYFSH RBNSFSH.

3.1.2.2 pVTBVPFLB RBTBNEFTPPL

rBTBNEFT args KHLBYSHCHBEF PRO UFTKHLFKHTH UDF_ARGS , YUMEOSH LPFPTPK RTYCHEDEOSHCH OJCE:

ხელმოუწერელი int arg_count yuYUMP RBTBNEFTPPL. RTPCHETSHFE LFP 'OBYUEOE CH CHOLGYY YOYGYBMYBGYY, EUMY CHSHCH IPFYFE, YUFPVSC CHBIB ZHOLGYS VSHMB CHCHCHCHBOB UP UREGYZHYUEULF YUY. OBTAINET, FBLYN LPDPN: if (args->arg_count != 2) ( strcpy(message,"XXX() მოითხოვს ორ არგუმენტს"); დაბრუნება 1; ) enum CHNPTSOSCHE OBYEOYS FYRPCH: STRING_RESULT , INT_RESULT AND REAL_. YuFPVSH KHDPUFPCHETYFSHUS, YuFP RBTBNEFTSH YNEAF DBOOSCHK FYR Y CHPCHTBEBAF PIYVLH, EUMY PIY L OENKH OE RTYOBDMETSBF, RTPCHETSHFE NBUUYCH YRG_Y. OVERTYNE: თუ (args->arg_type != STRING_RESULT || MYЪBGYY, YUFPVSH KHUFBOPCHYFSH LMENEOFSH arg_type L FYRBN, LPFPTSHCHCH ІПФФФФЭ РПМХУИФОФСВТ. xx() . LBL UFTPLH Y YYUMP, UDEMBKFE UMEDHAEE CH xxx_init() : args->arg_type = STRING_RESULT; არგს->arg_type = INT_RESULT; char **args args->args UPPVEBEF YOZHPTNBGYA ZHOLGYY YOYGYBMYBGYY PFOP UYFEMSHOP PVEEZP IBTBTFFNETBCHBBTFFNE OOPZP RBTBNEFTB (LPOUFBOFSHCH ) i args->args[i] TBCHOP 0 SHJHEF FPMSHLP LPOUFBOFSHCH, FYRB 3, 4*7-2 YMY SIN (3.14). TBNEFTTBNIY. PVTBFYFSHUS L RBTBNEFTKH i UMEDHAEIN PVTBBPN:

  • RBTBNAFT FYRB STRING_RESULT , DBOOSHK LBL KHLBBBFEMSH UFTPLY RMAU DMYOB, RPЪCHPMSEF PVTBVPFLH DCHPYUOSCHI DBOOSCHI YMY DBOOSCHI RTPYCHPM. UPDETSBOYE UFTPLY DPUFHROP LBL args->args[i] , B DMYOB UFTPLY LBL args->სიგრძეები[i] . CHCH OE DPMTSOSCH UYYFBFS, YuFP UFTPLB EBCHETYBEFUS OKHMECHSHN UYNCHPMPN.
  • dMS RBTBNEFTB FYRB INT_RESULT hSH DPMTSOSCH RTYCHEUFY args->args[i] L FYRH long long: long long int_val; int_val = *((გრძელი გრძელი*) args->args[i]);
  • dMS RBTBNEFTB FYRB REAL_RESULT hSH DPMTSOSCH RTYCHEUFY args->args[i] L FYRH ორმაგი: ორმაგი real_val; real_val = *((ორმაგი*) args->args[i]);
ხელმოუწერელი გრძელი *სიგრძეები DMS ZHKHOLGYY YOYGYBMYBGYY, NBUUYCH სიგრძე KHLBSHCHCHBEF NBLUINBMSHOHA DMYOH UFTPLY DMS LBTSDPZP RBTBNEFTB. DMS LBTSDPZP PVTBEEOYS L PUOPCHOPK ZHKHOLGYY სიგრძე ITBOYF ZBLFYUEULYE DMYOSCH MOVCHI UFTPLPCCHI RBTBNEFTPCH, LPFPTSHCHE RETEDBOSH DMS DMS ЇЇ CHTENS. DMS RBTBNEFTPCH FYRPCH INT_RESULT YMY REAL_RESULT სიგრძე ITBOIF NBLUINBMSHOHA DMYOH RBTBNEFTB (LBL DMS ZHKHOLGYY YOYGYBMYBGYY).

4.1.2.3

zHOLGYS YOYGYBMYBGYY PPCHTBFYF 0, EUMY OILBLBS PIVLB OE RTPYPIMB, Y 1 H RTPPHYCHOPN UMHUBE. eUMMY PIYVLB RTPYUIPDYF, xxx_init() DPMTSOB UPITBOIFSH UPPVEEOYE PV PIYLE U OKHMECHNY UYNCHPMPN CH LPOGI CH RBTBNAFTE შეტყობინება . UPPVEEOYE VHDEF CHPCHTBEEOP RPMSHJPCHBFEMA. vKHZHET UPPVEEOYK YNEEF DMYOHH CH MYSQL_ERRMSG_SIZE UYNCHPMPCH, VP CHCH DPMTSOSCH RPRTPVPCHBFSH UPTBOYFSH UPPVEEOYE CH 80 UYNCHPMBI FBLODBTOBLPVPET

'OBYOOYE CHPCHTBFB PUOPCHOPK ZHKHOLGYY xxx() ЪBCHYUYF PF FYRB. dMS ZHOLGYK FYRPCH გრძელი გრძელი І ორმაგი POP RTEDUFBCHMSEF UPVK UPVUFCHOOOP ZHOLGYPOBMSHOPE 'შესახებ. UFTPLPCCHESHKHOLGYY DPMTSOSCH CHPCHTBFYFSH KHLBBEBFEMSH TEKHMSHFBF Y UPITBOYFSH DMYOH UFTPLY CH RBTBNEFTBI სიგრძის შესახებ. 'DEUSH შედეგი RTEDUFBCHMSEF UPVPK VKHJET DMYOPK CH 255 VBKF. hUFBOPCHYFE YI L UPDETSBOYA Y DMYOE 'OBYEOYS. OBRTYNE:

Memcpy (შედეგი, "შედეგის სტრიქონი", 13); * სიგრძე = 13;

eUMY chBIY ZHKHOLGYY UFTPLY DPMTSOSCH PPЪCHTBFYFSH UFTPLH DMYOOEE, YUEN 255 VBKF, TBURTEDEMYFE RBNSFSH DMS TEKHMSHFBFB YUTE malc () , B UBNSPFYFECHin x. hsch NPTSEFE UPITBOSFSH TBURTEDEMOOHA RBNSFSH CH UMPFE ptr UFTHLFHTSCH UDF_INIT DMS RPCHFPTOPPZP YURPMSHJPCHBOYS CH VKHDHEEN PVTBEOOY xxx(xxx RPDTPVOPUFHPYCH. CHE UDF“.

yuFPVSH KHLBSHCHBFSH OBYOOYE PPCHTBFB NULL CH PUOPCHOPK ZHKHOLGYY, KHUFBOPCHYFE არის_null CH 1:

*is_null=1;

YuFPVSH KHLBBBFSH CHPCHTBF PIYLL CH PUOPCHOPK ZHKHOLGYY, KHUFBOPCHYFE RBTBNEFT PIYL (შეცდომა)

*შეცდომა=1;

eUMMY xxx() HUFBOBCHMYCHBEF *შეცდომა Ch 1 DMS MAVPK UFTPLY, JHOLGYPOBMSHOPE 'OBYEOYE NULL DMS FELHEEK CH LPFPTPK CHSCCHCHBMBUSH XXX() . rTYUEN, xxx() OE VHDEF DBCE ЪBRTBBIYCHBFSHUS DMS RPUMEDHAYE UFTPL. rtyneyboye:წელი MySQL DP CHETUIY 3.22.10 წელი DPMTSOSCH KHUFBOPCHYFSH *შეცდომა Y *is_null:

*შეცდომა=1; *is_null=1;

3.1.2.4 lPNRYMSGYS Y KHUFBOPCHLB PRTEDEMSENSCHI RPMSHЪPCHBFEMEN ZHKHOLGYK

ZhBKMSCH, CHSHRPMOSAEYE UDF, DPMTSOSCH LPNRYMYTPCHBFSHUS Y KHUFBOBCHMYCHBFSHUS ბუღალტერიის შესახებ. LFPF RTPGEUU PRYUBO OYCE DMS RTYNETOPZP UDF-ZHBKMB udf_example.cc , LPFPTSCHK CHLMAYUEO CH DIUFTYVHFYCH YUIPDOYLPCH MySQL. lFPF ZhBKM UPDETSYF UMEDHAEYYE ZHOLGYY:

  • metaphon() CHPCHTBEBEF NEFB-UFTPLH DMS UFTPLPCHPZP RBTBNEFTB. LFP RPIPCE PRO soundex, OP VPMSHI ЪBFPYUEOP RPD BOZMYKULYK.
  • myfunc_double() CHPCHTBEBEF UHNNH ASCII-OBYUEOYK UYNCHPMPCH CH RBTBNEFTBI, RPDEMEOOKHA UHNNH DMYO LFYI RBTBNEFTPH-ის შესახებ.
  • myfunc_int() CHPCHTBEBEF UHNNH DMYO RBTBNEFTPCH.
  • sequence() PPЪCHTBFYF RPUMEDPCHBFEMSHOPUFSH, OBUYOBAYEHAUS U ЪBDBOOPZP YUYUMB YMY U 1, ЄUMY OILBLPZP YUYUMB ЪBDBOP OE VSHMP.
  • lookup() CHPCHTBEBEF IP-BDTEU.
  • reverse_lookup() CHPCHTBEBEF ჰოსტის სახელი DMS IP-BDTEUB. ZHOLGYS NVCEF VSHFSH CHCHCHBOB UP UFTPLPK "xxx.xxx.xxx.xxx" YMY U 4 JUYUMBNY.

dYOBNYUEULY ЪBZTHTSBENSCHK ZHBKM DPMTSEO LPNRYMYTCHBFSHUS LBL TBDEMSENSHCHK PVAELFOSHCHK ZHBKM, YURPMSHЪHS LPNBODH:

Shell> gcc -გაზიარებული -o udf_example.so myfunc.cc

chsch NPTSEFE MEZLP CHSHCHSUOSFSH RTBCHYMSHOSHCH RBTBNEFTSCH LPNRYMSFPTB DMS chBIEK UYUFENSCH, ЪBRHULBS FBLHA LPNBODH CH LBFBMPZE sql hch SQL:

Shell> make udf_example.o

ChSH DPMTSOSCH CHSHRPMOYFSH LPNBODH LPNRYMSGYY, RPDPVOKHA PDOPK YЪ FEI, YuFP PFPVTBTSBEF მწარმოებელი , Б YULMAYUEOYEN FPZP, YuFP ChSCH DPMTSKHSCH UFTPLYCHFSHPOCHPOXA UFTPLYCHFSHPOXA. G UFTPLY. OELPFPTSCHI UYUFENBI KHDBMSFSH -c OE OBDP, RTPVHKFE-ს შესახებ.

lBL FPMSHLP chsch ULPNRYMITHEFE PVEDPUFHROSCHK PVYAELF, UPDETSBAKE UDF, chsch DPMTSOSCH KHUFBOPCHYFSH EZP Y UPPVEYFSH MySQL P TBUYYYTEOY JH. lPNRYMSGYS PVEEDPUFKHROPZP PVYAELFB YЪ udf_example.cc RTPYYCHPDYF ZBKM U YNEOEN udf_example.so (FPYOOPE YNS NPTsEF YЪNEOSFSHUS PF RMBFZFSHUS PF RMBFZFZH ULPMPFSHFTHK HERE YEEF ZHBKMSCH ld, OBRTYNET, ch /usr/lib NOPZYI UYUFENBI CHSC NPTSEFE KHUFBOBCHMYCHBFSH UYUFENOKHA RETENEOOKHA LD_LIBRARY YMY LD_LIBRARY_PATH DF. tHLLPCHPDUFCHP PRO dlopen UPPVEBEF chBN, LPFPTHA RETENEOOHA chshch DPMTSOSCH YURPMSHJPCHBFSH PRO chBIEK UYUFEN. chsch DPMTSOSCH KHUFSqMqlsserve.

rPUME FPZP, LBL VYVMYPFELB HUFBOPCHMEOB, UPPWAYFE mysqld PFOPUYFEMSHOP OPCHSHCHI

Mysql> CREATE FUNCTION მეტაფონი აბრუნებს STRING SONAME "udf_example.so"; mysql> CREATE FUNCTION myfunc_double აბრუნებს REAL SONAME "udf_example.so"; mysql> CREATE FUNCTION myfunc_int აბრუნებს მთელი SONAME "udf_example.so"; mysql> CREATE FUNCTION ძიება აბრუნებს STRING SONAME "udf_example.so"; mysql> CREATE FUNCTION reverse_lookup აბრუნებს STRING SONAME "udf_example.so";

ZHKHOLGYY NPZHF VShchFSH HDBMEOSH, YURPMSHJHS ვარდნის ფუნქცია:

Mysql> DROP FUNCTION მეტაფონი; mysql> DROP FUNCTION myfunc_double; mysql> DROP FUNCTION myfunc_int; mysql> DROP FUNCTION ძიება; mysql> DROP FUNCTION reverse_lookup;

YOUFTHHLGYY CREATE FUNCTION Y DROP FUNCTION NPDYZHYYTHAF UYUFENOHA FBWMYGH func CH VB'Є DBOGI mysql. YNS JHOLGYY, FYR Y PVEEDPUFHROPE VYVMYPFEYUOPE YNS VHDHF UPTBOEP CH FBVMYGE. CHCH DPMTSOSCH YNEFSH RTYCHYMEZYY ჩასმაწაშლა DMS VBSH DBOSHI mysql, YuFPVSH UPЪDBCHBFSH Y KHDBMSFSH UCHPY ZHKHOLGYY.

CHCH OE DPMTSOSCH YURPMSH'PCHBFSH CREATE FUNCTION, YUFPVSH DPVBCHYFSH ZHKHOLGYA, LPFPTBS HCE VSHMB UP'DBOB. eUMY CHCH DPMTSOSCH RPCHFPTOP KHUFBOPCHYFSH ZHKHOLGYA, UOBYUBMB KHDBMYFE ЇЇ YUTE CHSHCHPCH DROP FUNCTION Y UBFEN RPCHFPTOP HUFBOPCHYFE ЇЇ RPN. chsch DPMTSOSCH UDEMBFS LFP, OBRTYNE, EUMY chsch PFLPNRYMYTPPCHBMY OPCHHA CHETUYA chBIEK ZHKHOLGYY, YUFPVSH mysqld PVOPCHYM YURPMYKH. YOBYU UTCHET RTDDPMTSYF RTYNEOSFSH UFBTHA CHETUYA.

BLFFYCHOSCHE JHOLGYY VHDHF RETEЪBZTHCEOSCH RTY LBTSDPN RETEЪBRHULE UETCHETB, EUMY CHCH OE ЪBRHULBEFE mysqld U PRGEK --skip-grant-tables . h LFPN UMKHYUBE YOYGYBMYBGYS UDF VHDEF RTPRHEEB, B UDF-ZHKHOLGYY UFBOKHF OEDPUFKHROSCHNIY. BLFYCHOBS ZHOLGYS RTEDUFBCHMSEF UPVPK ZHOLGYA, ЪБЗТХЦЕОХА UЭTE CREATE FUNCTION, OP OE KhDBMEOOKHA DROP FUNCTION.

3.1.3 dPVBCHMEOYE OPCHSHCHI CHUFTPEOOCHI ZHKHOLGYK

rTPGEDKHTB DMS DPVBCHMEOYS OPChPK CHUFTPEOOOPK ZHOLGYY PRYUBOB OITSE. pVTBFYFE CHOYNBOYE, YuFP SCHSCHO NPTSEFE DPVBCHMSFSH CHUFTPEOOSH ZHKHOLGYY L DCHPYUOPNH DYUFTYVHFYCHH RPFPNKH, YuFP RTPPGEDKHTBY FB MySQL. CHCH DPMTSOSCH ULPNRYMYTPCHBFSH MySQL UBNPUFPSFEMSHOP YYYUPDOYLPCH. fBLCE PVTBFYFE CHOYNBOYE, YuFP, EUMY chsch NyztjThefe DTHZKHU CHETUYA MySQL-ის შესახებ (OBRTYNET, LPZDB OPCHBS CHETUIS CHSHCHRHEEOB), chsch VKhDPHTHTHDFT OPChPK CHETUY.

YuFPVSH DPVBCHYFSH OPCHHA CHUFTPEOOKHA ZHKHOLGYA MySQL, OHTsOP:

  1. dPVBCHSHFE PDOKH UFTPLH CH ZHBKM lex.h , LPFPTBS PRTEDEMSEF YNS ZHKHOLGYY CH NBUiko sql_functions .
  2. eUMY ZHOLGYPOBMSHOSCHK RTPPFPFYR RTPUF (VETEF OE VPMEE FTEI RBTBNEFTPCH), chShch DPMTSOSCH H lex.h PRTEDEMYFSH SYM(FUNC_ARG#) FPTK RBTBNEFT HNBTBNEFT HNBUVYDHQYQVYCH , LPFPTBS UP'DBEF JHOLGYPOBMSHOSCHK PVYAELF, CH item_create.cc. uNPFTYFE "ABS" Y create_funcs_abs() LBL RTYNET. eUMY ZHOLGYPOBMSHOSCHK RTPFPFYR HUMPTSOEO (OBRTYNET, VETEF RETENOOPE YYUMP RBTBNEFTPCH), chShch DPMTSOSCH DPVBCHYFSH DCHE UFTPLY Lsql lBCDBS KHLGTPYCCPPUTFTP SEO PRTEDEMYFSH (LFP DPMTSOP VSHFSH DPVBCHMEOP CH OBYUBMI ZHBKMB). 'BFEN PRTEDEMYFE ZHOLGYPOBMSHOSCH RBTBNEFTSCHY DPVBCHSHFE BMENEOF U LFYNY RBTBNEFTBNY DMS RTBCHYMB UYOFBLUYUEULPZP BOBMY DMS RTYNETB, RTPCHETNECHFEUFTBNYs. , YuFPVSH HCHYDEFSH, LBL LFP CHSHPRPMOEOP.
  3. h item_func.h PVIASCHYFE OBUMEDPCHBOYE LMBUUB YЪ Item_num_func YMY Item_str_func , CH BCHYUINPUFY PF FPZP, PP'CHTBEBEF MY chBIB ZHOLGYS.
  4. h item_func.cc DPVBCHSHFE PDOP YI UMEDHAE PVYASCHMEOYK CH BCHYUINPUFY PF FPZP, PRTEDEMSEFE MY CHCH YUYUMPCHHA YMY UFTPLPCHHA tem_func_newname:: *_nItem:String: OBUMEDHEFE hBI PVYAELF PF MAVPZP YЪ UFBODBTFOSCHI UMENEOFPCH (RPDPVOP Item_num_func , ChSHCH, CHETPSFOP, DPMTSOSCH FPMSHLP PRTEDEMYFSH PDІH YЪ CHSHCHHYFR SH TPDYFEMSHULPNH PVAELFH ЪBVPFYFSHUS P DTHZYI ZHOLGBRTY_nc:
  5. CHCH DPMTSOSCH, CHETPSFOP, FBLCE PRTEDEMYFSH UMEDHAEHA PVYALFOKHA ZHOLGYA: void , YUIPDS YI DBOOSCHI RBTBNEFTPCH. max_length ЪBDBEF NBLUINBMSHOPE YYUMP UYNCHPMPCH, LPFPTPPE ZHOLGYS NPTSEF CHPCHTBEBFSH. LFB ZHOLGYS DPMTSOB FBLCE KHUFBOPCHYFSH maybe_null=0 , EUMY PUOPCHOBS ZHOLGYS OE NPTSEF PP'CHTBEBFSH 'OBYEE NULL . zHOLGYS NVCEF RTPCHETYFSH, URPUPVEO MY MAVPK YЪ RBTBNEFTPCH CHPCHTBBEBFSH NULL , RTPCHETSS RETENEOOKHA RBTBNEFTPCH შესაძლოა_null . CH NPTSEFE YJKHYUFSH Item_func_mod::fix_length_and_dec CH LBYUUFCHE FYRYUOPZP RTYNETB FPZP, LBL CHUYE LFP UDEMBFSH.

Chue ZHOLGYY DPMTSOSCH VSHCHFSH RPFPYUOP-VEYPRBUOSCHNIY (DTHZYYY UMPCHBNY, OE YURPMSHYHKFE MOVSHHE ZMPVBMSHOSCH YMY UFBFYUEULYE FPVSH 'BEIFYFSH YI mutex YUETE').

eUMY CHCH ІПФИФЭ ППЪЧТБЭБФШ NULL Ъ::val() , ::val_int() YMY::str() CHCH DPMTSOSCH KHUFBOPCHYFSH null_value CH 1st CHETOKHFSH YOLGY ZHKH

dMS PV'YaELFOPK ZHKHOLGYY::str()

  • rBTBNEFT სიმებიანი *str PVEUREYUYCHBEF VKHZHET UFTPLY, LPFPTSCHK NVCEF YURPMSHЪPCHBFSHUS, YUFPVSH ITBOYFSH TEKHMSHFBF. dMS RPMHYUEOYS VPMSHIEZP LPMYUUEUFCHB YOZHPTNBGYY PFOPUYFEMSHOP FYRB სტრიქონი PVTBFYFEUSH L ZHBKMH sql_string.h.
  • zHOLGYS::str() DPMTSOB CHP'CHTBFYFSH UFTPLH, LPFPTBS ITBOIF TE'KHMSHFBF, YMY (char*) 0 , EUMY TE'KHMSHFBFPN SCHMSEPHUS NULL .
  • Chue FELKHEYE ZHKHOLGYY UFTPLY OE DPMTSOSCH TBURTEDEMSFSH OILBLHA RBNSFSH, EUMY LFP OE BVUPMAFOP OEPVIPDYNP!

3.2 dPVBCHMEOYE OPCHCHI RTPGEDHT CH MySQL

h MySQL CHCH NPTSEFE PRTEDEMSFSH RTPGEDHTH PRO C++, LPFPTBS NPTSEF PVTBEBFSHUS Y YYNEOSFSH DBOOSCH BBRTPUY RTETSDE, YUEN POY PFRTBCHFSUS. NPDYZHYLBGYS NPTSEF VSHFSH CHSHRPMOOEOB შესახებ HTPCHE UFTPLY YMY GROUP BY.

bChFPTSH RBLEFB UPJDBMY RTPGEDHTH RTYNETB M MySQL ვერსია 3.23, YuFPVSH RPLBBBFSH chBN, YuFP FBN NPTSEF VShchFSH CHSHCHRPMOEOP.

dPRPMOYFEMSHOP BCHFPTSCH TELPNEODHAF chBN RPUNPFTEFSH ZBKM mylua, LPFPTSCHK chsch NPTSEFE OBKFY ch LBFBMPZE კონტრიბ. chsch NPTSEFE YURPMSHЪPCHBFSH SЪSHL LUA, YuFPVSH ЪБЗТХЪЪФШ RTPGEDHTH CH mysqld RTSNP PP CHTENS CHSHCHRPMOEOYS.

3.2.1 BOBMYЪ RTPGEDHT

ანალიზი ()

bFB RTPGEDKHTTB PRTEDEMEOB CH sql/sql_analyse.cc. POB YUUMEDHEF TEKHMSHFBF, RPMKHYUEOOOSCHK YЪ chBIZP ЪBRTPUB, Y PPЪCHTBEBEF BOBMYЪ TEKHMSHFBFPCH:

  • max ელემენტები (RP KHNPMYUBOYA 256) ЪBDBEF NBLUINBMSHOPE YUMP TBOSCHI OBYUEOYK, LPFPTSHCHE ანალიზი ЪББНЭФФ Ф УФПМВГЭ. LFP YURPMSH'HEFUS, YuFPVSH RTPCHETYFSH PRFYNBMSHOPUFSH RTYNEOOYS FYRB ENUM .
  • მაქსიმალური მეხსიერება (RP KHNPMYUBOYA 8192) ЪBDBEF NBLUINKHN RBNSFY, LPFPTHA ანალიზი DPMTSEO TBURTEDEMYFSH UFPMVEG RTY RPRSCHFLE OBKFY CHUY PFMY.
აირჩიეთ ... FROM ... WHERE ... პროცედურების ანალიზი(])

3.2.2 OBYUBOY RTPGEDHT

შესახებ UEZPDOSIOYK DEOSH EDYOUFCHOOOPK DPLHNEOFBGYIK DMS LFPZP SCHMSEFUS YUIPDOSCHK LPD RBLEFB.

CHSC NPTSEFE OBKFY CHUA YOZHPTNBGYA PFOPUYFEMSHOP RTPPGEDHT, YUUMEDHS ZHBKMSCH:

  • sql/sql_analyse.cc
  • sql/პროცედურა.თ
  • sql/procedure.cc
  • sql/sql_select.cc

3.3 OBUYOLB MySQL

'FB ZMBCHB PRYUSCHCHBEF NOPZP CHEEEK, LPFPTSCHE CHSH DPMTSOSCH OBFSH RTY TBVPFE LPD MySQL-ის შესახებ. eUMMY CHCH RMBOITHEFE URPUPVUFCHPCHBFSH MySQL TBTBVPFLE, YNEFSH DPUFHR LPDH PFMBTSYCHBENSHI CHETUYK YMY IPFIFE FPMSHLP UMEDYFSHB N CH TBDEME " ". eUMY CHCH ЪББЪБЪБЪФЭТУПЧБОСЧ CHOHFTEOOEK PTZBOYBGYEK MySQL, CHCH DPMTSOSCH FBLCE RPDRYUBFSHUS PRO UREGYBMSHOSCHK URYUPL TBUUSCHMLY [ელფოსტა დაცულია].

3.3.1 RPFPLY H MySQL

MySQL ACCOUNTING UPЪDBEF UMEDHAEYI RPFPLY:

  • RPFPL TCP/IP-RPDLMAYUEOYK PVTBVBFSHCHBEF CHUE RPDLMAYUEOYS, ЪBRTBBIYCHBEF Y UPJDBEF OPCHSHCHK UREGYBMYJTPCHBOOSCHK RPFPBFPVF RTPMSHBSPLSPL.
  • h Windows NT YNEEFUS DTBKCHET YNEOPCHBOOPZP LBOBMB, LPFPTSCHK DEMBEF FH TSE UBNHA TBVPFKH, YuFP Y RPFPL TCP/IP, OP U ЪBRTPUBNIY PRO YNEOPCHBOOPN
  • RPFPL UYZOBMB PVTBVBFSHCHBEF CHUYE UYZOBMSCH. შესაბამისად FBLCE PVSHYUOP PVTBVBFSHCHBEF FTECHPZY Y CHSHSHCHCHBEF process_alarm() , YUFPVSH UBCHETYYFSH RPDLMAYUEOYS, LPFPTSCHE VSHMY OEBLFYCHOSCH UMIL.
  • eUMY mysqld LPNRYMYTHEFUS U -DUSE_ALARM_THREAD, UREGYBMYYTPCHBOOSCHK RPFPL, LPFPTSHCHK PVTBVBFSHCHBEF FTECHPZY, VHDEF UPJDBO. Lfp yurpmsh'hefus fpmshlp შესახებ oelpfptshchi uyufenbi, აქ yneafus rtpvmensh u sigwait (), ymy єumy єumy єufsh oedpupbfly ch rtyneooy lp ne veyboopzpplbmbmbmbmbmbmbmbmbmbmb.
  • еUMY YURPMSHЪPCHBOB PRGYS --flush_time=# , VHDEF UPЪDBO ЇЇ PDYO UREGYBMYYYTPCHBOOSCHK RPFPL, LPFPTSCHK UVTBUSCHCHBEF FBVMYGSHCH DYU-ს შესახებ
  • lBCDPE UPEDYOEOEYE PVTBVBFSCCHBEFUS UCHPYN RPFPLPN.
  • lBCDBS FBVMYGB, LPFPTPK-ის შესახებ YURPMSHЪPCHBOB YOUFTHLGYS ჩასმა დაგვიანებულია, RPMKHUBEF UPVUFCHEOOSCHK RPFPL.
  • eUMY CHCH YURPMSH'HEFE --მასტერ-მასპინძელი, VHDEF ЪBRHEEO RPFPL TERMYLBGYY, YUFPVSH YUFBFSH Y RTYNEOSFSH NPDYZHYLBGYY U ZMBCHOPZP UETCHB.

mysqladmin processlist RPLBYSHCHBEF FPMSHLP RPDLMAYUEOYS, RPFPLY TERMYLBGYYY ჩასმა დაგვიანებულია.

3.3.2 oBVPT FEUFPL MySQL

dP OEDBCHOEZP READING PUOPCHOPK OBVPT FEUFB VSHM PUOPCHBO UPUFBCHMSAEYI UPVUFCHOOPUFSH DBOOSCHI 'BLB'YULB Y RP LFPC RTYYUYOHO OE VSHCH. edYOUFHEOOSCHK RHVMYYUOP DPUFKHROBS YBUFSH RTPGEUUB FEUFYTPCHBOYS UPUFPSMB YЪ FEUFB crash-me , LFBMPOOPZP FEUFB Perl DBI/DBD, Obi TBOPPVBECHBOSCHI ტესტები. pFUKHFUFCHYE UFBODBTFYYTPCHBOOPZP RHVMYUOP DPUFKHROPZP OBVPTB FEUFPCH UDEMBMP FTHDOSHCHN DMS RPMSHЪPCHBFEMEK Y TBTBVPFYUYLPCH YUFPVYFYBSHFHBH UPJDBMY UPCHETYOOOP OPCHHA UYUFENH FEUFPCH, LPFPTBS FERETSH CHLMAYUEOB CH YUIPDY OBUYOBS U ვერსია 3.23.23.

FELHAKE OBVPT FEUFPCH OE RTPCHETSEF CHUE CH MySQL, OP DPMTSEO PICHBFYFSH OBYVPMEE PYUECHYDOSHCH PYYVLY CH PVTBVPFLB LPDB SQL, OS/ბიბლიოთეკა RTPVUFMENSHY. lPOYUOBS GEMSH UPUFPYF CH FPN, YuFPVSH YNEFSH FEUFSCH, RPLTSCHCHBAEYI 100% LPDB. CHCH NPTSEFE RTEDPUFBCHYFSH FEUFSHCH, LPFPTSCHE YUUMEDHAF ZHOLGYPOBMSHOSHE PP'NPTSOPUFY, LTYFYUOSHE DMS chBIEK UYUFENSCH, RPULPMSHHHH YE CHSHCHRHULYBTFHDFMYFMBTY DOSHCHNIY RTPZTBNNBNNY.

3.3.2.1 'BRHUL OBVPTB FEUFPL MySQL

UYUFENB FEUFB UPUFPYF YOFETRTEFBFPTB SSHLPCH FEUFPCH (mysqltest), ULTYRFB PVPMPYULY, YUFPVSHCHSHCHRPMOYFSH CHUY FEUFSH (mysql-ტესტი-UF PCHBOCHURFMYPYULY YI PTSYDBENSHCHI TEIKHMSHFBFPCH. mysql-test/mysql-test-run J LPTOECHPZP LBFBMPZPYB. E სკრიპტები /mysql-ტესტი-ტესტი CHUE FEUFSH DPMTSOSCH CHSHRPMOYFSHUS.euMY LFPZP OE RTPYPIMP, RTPRPVHKFE CHSHCHSUOYFSH RPYENH Y UPPWAYFE P RTPVMENE, EUMY LFP PIVLBFPFPVSCHMYLFPVPVPVPVMYMY LFPBFPVPVPVPVMYPFPVPVMYMYLFPVPVPVPVMYMYLFPVPVPVMYPFPVPVPVPVPVPVMYPFPVPVPVPVPVPVPVPVMYMY L".

EUMY CHCH YNEEFE LPRYA mysqld NBIYE, TU CHCH IPFYFE CHSHRPMOYFSH OBVPT FEUFPCH, CHCH OE DPMTSOSCH PUFBOBCHMYCHBFSH ЇЇ, EUMY POB OE 3 07 შესახებ. eUMY PDYO YY LFYI RPTFPCH RTYNEOSEFUS, hCH DPMTSOSCH PFTEDBLFYTPCHBFSH mysql-ტესტი-გაშვებული SEFUS DPUFHROSCHN.

CHCH NPTSEFE ЪBRKHUFYFSH YODYCHYDHBMSHOP LBTSDSCHK FEUF LPNBODPK mysql-test/mysql-test-run test_name .

eUMY PDYO FEUF UCHBMYMUS, RTPCHETSHFE TBVPFH mysql-test-run U PRGYEK --force , YUFPVSH RTPCHETYFSH, UVPSF MY MAVCHE DTHZYI FEUFSH.

3.3.2.2 TBUYTEYOE OBVPTB FEUFPCH MySQL

chsch NPTSEFE YURPMSHЪPCHBFSH SjShchL mysqltest, YUFPVSH RYUBFSH chBIY UPVUFCHOOOSCHO UMHYUBY FEUFB. l UPTsBMEOYA, BCHFPTSCH RBLEFB ЇЇ OE OBRYUBMY RPMOHA DPLHNEOFBGYA DMS OEZP. CHSC NPTSEFE, PDOBLP, TBUUNBFTYCHBFSH FELHEYI UMHYUBY FEUFB Y YURPMSHЪPCHBFSH YI LBL RTYNET. UMEDHAEYYE RHOLFSH DPMTSOSCH RPNPYUSH chBN:

  • fEUFSH OBIPDSFUS CH LBFBMPZE mysql-test/t/*.test
  • UMHYUBK FEUFB UPUFPYF YЪ ЪBCHETYEOOPK FPYULPK U ЪBRSFPK (;) YOUFTHLGYY Y RPDPVEO CHCHPDH LMYEOFB LPNBODOPK UFTPLY mysql. yOUFTHLGYS RP KHNPMYUBOYA: ЪBRTPU, LPFPTSCHK VHDEF RPUMBO UETCHETH MySQL, EUMY PO OЇ TBURPIOBI LBL CHOKHFTEOOSS LPNBODB (OBRTYNET, ძილის).
  • CHUE ЪBRTPUSCH, LPFPTSHCHE RTPYCHPDSF TEЪKHMSHFBFSCH, OBRTYNE, SELECT , SHOW , EXPLAIN Ъ RTPYUYЄ, OHTSOP RTEDCHBTYFSH KHLBBOYEN @/path/path/to/to FBFSH. rTPUFPK URPUPV ZEOETYTPCHBFSH ZHBKM TE'KHMSHFBFB B UPUFPYF CH FPN, YuFPVSC CHSHRPMOYFSH mysqltest -r yuFPVSH CHUY UPPFCHEFUFCHBMP KHUFBOPSHFBFPN MPZ mysql-test/r Y OB'CHBFSH YI LBL test_name.result . eUMY FEUF RTPYCHPDYF VPMSHI, YUEN PDO TEKHMSHFBF, CHCH DPMTSOSCH YURPMSHЪPCHBFSH test_name.a.result , test_name.b.result Y FBL DBMEE.
  • eUMY YOUFTHLGYS CHPCHTBEBEF PIYVLH, CHCH DPMTSOSCH PRO UFTPLE RETED OEK HLBJBFSH --error error-number . 'DEUSH შეცდომის ნომერი NPTSEF VSHFSH URYULPN CHPNPTSOSHI LPDPCH PIVVPL, PFDEMSENCHI ЪBRSFSHCHNIY (,).
  • eUMY CHCH ЪBRYUSCHCHBEFE UMHYUBK FEUFB TERMYLBGYY, CHCH DPMTSOSCH CH RETCHPK UFTPLE ZHBKMB FEUFB RPNEEBFSH წყარო მოიცავს/master-slave.inc; . YuFPVSH RETELMAYUBFSHUS NETSDH ZMBCHOPK Y RPDYUYOOOPK UYUFENBNY, YURPMSH'HKFE კავშირის მასტერი; კავშირის მონა; . eUMY CHCH DPMTSOSCH DEMBFSH YUFP-FP PRO BMSHFETOBFYCHOPN RPDLMAYUEOYY, CHCH NPTSEFE UDEMBFS RPDLMAYUEOYE კავშირის master1; DMS ZMBCHOPK Y კავშირი slave1; VHI RPDYUYOOOPK UYUFENSCH.
  • eUMY CHCH DPMTSOSCH DEMBFSH YuFP-FP CH GYLME, CHCH NPTSEFE YURPMSHЪPCHBFSH: მოდით $1=1000; ხოლო ($1) ( # hShchRPMOSEN ЪDEUSH ЪBRТPU. დეკ $1; )
  • YuFPVSH VEDEKUFCHPCHBFSH NETSDH ЪBRTPUBNY, YURPMSHЪHKFE LPNBODH ძილის . pob RPDDETTSYCHBEF DPMY UELKHODSCH, FBL YuFP chShch NPTSEFE KHLBBFSH ძილი 1.5; , OBRTYNET, YUFPVSH VE'DEKUFCHPCHBFSH 1.5 VEKHODSCH.
  • YuFPVSHCHSHCHRPMOSFSH RPDYUYOOOPZP U DPRPMOYFEMSHOSHNY RBTBNEFTBNY DMS CHBEZP UMKHYUBS FEUFB, RPNEUFYFE YI CH ZHTNBFE LPNBODOK/ . DMS ZMBCHOPK UYUFENSCH RPNEUFYFE YI CH ZBKM mysql-test/t/test_name-master.opt .
  • eUMY CHCH YNEEFE PPRTPU PFOPUIFEMSHOP OBVPTB FEUFB YMY UMHYUBK FEUFB, LPFPTSCHK NVCEF RTYZPDYFSHUS CHUEN, OBRYIYFE PV LFPN OB [ელფოსტა დაცულია]. rPULPMSHLH URYUPL OE RTYOINBEF CHMPTSEOYS, CHCH DPMTSOSCH ЪBLBLYUBFSH RP ftp CHUYE TEMECHBOFOSH ZHBKMSCH PRO ftp://support.mysql.com/pub/mysql/Incoming .

3.3.2.3 lBL UPPVEBFSH PV PIYLLBI CH OBVPTE FEUFPCH MySQL

eUMY chBIB CHETUIS MySQL OE CHSHRPMOSEF OBVPT FEUFPCH, CH DPMTSOSCH UDEMBFS FBL:

  • OE FPTPRYFEUSH RPUSHMBFSH PFUYEF PV PIYLE! uOBYUBMB TB'VETYFEUSH FPMLPN, YuFP FBN KH CHBU RTPYUIPDYF Y RPYUENKH. eUMY PFUEF CHUE-FBL RTYDEFUS RPUMBFSH, RPTsBMHKUFB, YURPMSHQHKFE DMS EZP ZEOETBGYY ULTYRF mysqlbug, YUFPVSH TBTBVPFYY FOPUYFEMSHOP chBIEK YUYHUFENS.
  • xDPUFPCHETSHFEUSH, YuFP CHLMAYUYUMY CHSHCHPD mysql-test-run Y UPDETSBOYE CHUEI.უარი ZHBKMPCH H LBFBMPZE mysql-test/r .
  • eUMY FEUF CHBMYFUS CH OBVPTE, RTPCHETSHFE, YuFP U OIN VHDEF RTPYUIPDYFSH RTY OERPUTEDUFCHEOOPN ЪBRHULE LPNBODPK: cd mysql-ტესტი mysql-test-run YUHZwiHFPYZULTY-YUHZwiHPRKYHGDE Y CHSHRPMOYFE mysql-test-run U PRGJEK -- გამართვა . eUMY LFP FBLCE FETRYF OEKHDBYUKH, ЪBLBUYUBKFE ZBKM FTBUUYTPCHLY RPTSBMHKUFB, OE LBVHDSHFE FBLCE CHLMAYUYFSH RPMOPPE PRYUBOIE chBIEK UYUFENSCH LDYUFENSCH, CHETUBYGT,
  • rPRTPVHKFE FBLCE CHSHRPMOYFSH mysql-test-run U PRGYEK --force , YUFPVSH KHCHYDEFSH, YNEEFUS MY MAVPK DTHZPK FEUF, LPFPTSCHK FPTSE FETRYF OECHDBH.
  • eUMY CHSC LPNRYMYTPPCHBMY MySQL UBNPUFPSFEMSHOP, YJKHUYFE THLPCHPDUFCHP RTEDNEF FPZP-ის შესახებ, LBL LPNRYMYTPCHBFSH MySQL chBIEK RMBFFFPZPFECHPYTPYSHJH-ის შესახებ VHFYCHPCH, LPFPTSCHK HCE PFLPNRYMYTPCHBO Y NPTSEF VSHFSH ULBUBO U http://www.mysql.com/ჩამოტვირთეთ chUE UFBODBTFOSHE DCHPYYUOSHE ZHBKMSCH DPMTSOSCH RTPPIPDYFSH FEUFYTPCHBOIE.
  • EUMY CHCH RPMKHYUBEFE PIVLH, RPDPVOP შედეგის სიგრძის შეუსაბამობა YMY შედეგის შინაარსის შეუსაბამობა , LFP PIOBUBEF, YuFP CHCHCHPD FEUFB OE UPPFCHEFUFCHBM FPYuOP. LFP NPTsEF VShchFSH PIVLPK CH MySQL, YMY DEMP CH FPN, YuFP chBIB CHETUIS mysqld RTPYCHPDYF NBMPUFSH YOSHCH TEKHMSHFBFSCH RTY OELPFPTSHCHI PVU. oEKHDBYUOSCH TEKHMSHFBFSH FEUFB VKHDHF RPNEEEOSCH CH ZBKM U FEN TSE UBNSHCHN PUOPCHOCNY YNEOEN, YUFP Y ZBKM TEKHMSHFBFB, OP U TBUYYTEOYEN.უარი. EUMY chBI UMHYUBK FEUFB FETRYF OEKHDBYUKH, CHCH DPMTSOSCH UTBCHOYFSH DCHB ZHBKMB. eUMY CHCH OE NPTSEFE KHCHYDEFSH, YUEN PIY PFMYUBAFUS, YUUMEDHKFE YI U RPNPESH od -c Y RTPCHETSHFE YI DMYOSCH.
  • eUMY FEUF FETRYF OEKHDBYUH RPMOPUFSHA, chsch DPMTSOSCH RTPCHETYFSH TSHTOBMSHCH LBFBMPZE mysql-test/var/log DMS CHSHCHSUOOEOYS FPZP, YuFP OE FBL.
  • eUMMY CHCH LPNRYMYTCHBMY MySQL U PFMBDLPC, NVTsOP RPRTPVPCHBFSH PFMBTSYCHBFSH FEUF ЪBRKHULPN mysql-სატესტო გაშვება U PRGYSNY --gdb Y/YMPDPV --debug. HBKMPCH FTBUUYTPCHL." eUMMY CHCH OE LPNRYMYTPCHBMY MySQL DMS PFMBDLY, CHETPSFOP, UFPYF UDEMBFSH LFP. fPMSHLP PRTEDEMYFE RBTBNEFT --გამართვის DMS CHSHCHJPCHB კონფიგურაცია ! RPDTPVOPUFY CH TBDEME " ".

SQL - გაკვეთილი 10. განხორციელებული ფუნქციები

ფუნქციები არის ოპერაციები, რომლებიც საშუალებას გაძლევთ მანიპულიროთ მონაცემებით. MySQL-ში შეგიძლიათ იხილოთ გამოყენებული ფუნქციების რამდენიმე ჯგუფი:
  • რიგის ფუნქციები.გამოიყენება ტექსტის მწკრივებისთვის, მაგალითად, მნიშვნელობების ამოჭრისთვის ან შევსებისთვის.

  • რიცხვითი ფუნქციები.შეიტყვეთ მათემატიკური მოქმედებების შესახებ ციფრულ მონაცემებზე. რიცხვითი ფუნქციების წინ არის ფუნქციები, რომლებიც ბრუნავს აბსოლუტურ სიდიდეებს, სინუს და კოსინუს ფუნქციებს, რიცხვის კვადრატულ ფესვს და ა.შ. ვიკორისტა ნაკლებად სუნავს ალგებრული, ტრიგონომეტრიული და გეომეტრიული გამოთვლებისთვის. იშვიათად ვხვდებით ვიკორებში, ამიტომ მათ არ შევხედავთ. თქვენ უნდა იცოდეთ რა ხდება და ყოველ ჯერზე დაგჭირდებათ MySQL დოკუმენტაციის კონსულტაცია.

  • ჩანთის ფუნქციები.გამოიყენება ცხრილებიდან მონაცემების ამოსაღებად, მაგალითად, თუ რაიმე მონაცემის შეჯამება გჭირდებათ მისი არჩევის გარეშე.

  • თარიღი და საათის ფუნქციები.ვიკორისტოვაია თარიღისა და საათის კეროვანი მნიშვნელობებისთვის, მაგალითად, თარიღებს შორის სხვაობის შესაცვლელად.

  • სისტემის ფუნქციები.დააბრუნეთ სერვისის ინფორმაცია DBMS-ში.

იმისათვის, რომ შევხედოთ განხორციელებულ ძირითად ფუნქციებს, ჩვენ უნდა შევქმნათ ახალი მონაცემთა ბაზა ისე, რომ მას ჰქონდეს რიცხვითი მნიშვნელობები და თარიღის მნიშვნელობები. 5 მონაცემთა ბაზის მსვლელობისას შევქმენით მონაცემთა ბაზის რელაციური მოდელი ონლაინ მაღაზიისთვის. დადგა დრო მისი გაყიდვის MySQL-ში, ახლა უკვე მტკიცედ დასრულდა.

ისე, გაოცებული ვარ მე-5 გაკვეთილის დანარჩენი დიაგრამა DB-დან და DB - მაღაზიის შექმნით.

მონაცემთა ბაზის მაღაზიის შექმნა;

აირჩიეთ სამუშაოდ:

და ჩვენ ვქმნით მასში 8 ცხრილს, როგორც სქემაშია: შესყიდვები (მომხმარებლები), გამყიდველები, შესყიდვები (გაყიდვა), მიწოდება (შემომავალი), შესყიდვების ჟურნალი (ჟურნალი_გაყიდვები), მიწოდების ჟურნალი (ჟურნალი_შემომავალი), პროდუქტები (პროდუქტები), ფასები (ფასები). ). ერთი გაფრთხილება, ჩვენი მაღაზია გაყიდის წიგნებს, ამიტომ პროდუქტების ცხრილში კიდევ ერთ ჩანაწერს დავამატებთ - ავტორი, პრინციპში, ეს არ არის საჭირო, მაგრამ რაღაცნაირად უფრო მნიშვნელოვანია.

ცხრილის კლიენტების შექმნა (id_customer int NOT NULL AUTO_INCREMENT, name char(50) NOT NULL, email char(50) NOT NULL, PRIMARY KEY (id_customer)); ცხრილის გამყიდველების შექმნა (id_vendor int NOT NULL AUTO_INCREMENT, სახელი char(50) NOT NULL, city char(30) NOT NULL, მისამართი char(100) NOT NULL, PRIMARY KEY (id_vendor)); შექმენით ცხრილის გაყიდვა (id_sale int nult null auto_increment, id_customer int null, date_sale თარიღი არ არის null, პირველადი გასაღები (id_sale), უცხოური გასაღები (id_customer) მითითებები მომხმარებლებს (id_customer)) შექმენით ცხრილი შემომავალი (id_incoming int null auto_increment, id_vendor int int NULL, თარიღი_შემოსვლის თარიღი NOT NULL, ძირითადი გასაღები (id_incoming), უცხოური გასაღები (id_vendor) REFERENCES მოვაჭრეები (id_vendor); შექმენით ცხრილის პროდუქტები (id_product int NOT NULL AUTO_INCREMENT, სახელი char(100) NOT NULL, ავტორი NOT(NOT) პირველადი გასაღები (id_პროდუქტი)); ცხრილის ფასების შექმნა (id_product int NOT NULL, date_price_changes date NOT NULL, ფასი ორმაგი NOT NULL, ძირითადი გასაღები (id_product, date_price_changes), უცხო გასაღები (id_product) REFERENCES პროდუქტები (id_product)_nesa პროდუქციის შექმნა id_sale int NOT NULL, id_product int NOT NULL, product int NOT NULL, PRIMARY KEY (id_sale, id_product), FOREIGN KEY (id_sale) REFERENCES sale (id_sale), FOREIGNპროდუქტის შექმნა ცხრილი magazine_magazine_incoming (id_incoming NOTULL, id_incomit NOTULL, id_incoming, id_incomity NULL, id_incoming, id_incomant, NULL, id_incoming, id_incoming, id_incomant, NULL, id_sale int. int NOT NULL, PRIMARY KEY (id_incoming, id_product), FOREIGN KEY (id_incoming) REFERENCES შემომავალი (id_incoming) ));

გთხოვთ გაითვალისწინოთ, რომ ცხრილებში შესყიდვის ჟურნალი, გამოქვეყნების ჟურნალი და ფასები არის ძირითადი გასაღები - საწყობები და ა.შ. მათი უნიკალური მნიშვნელობები ემატება ღირებულების წყვილებს (ცხრილს შეიძლება ჰქონდეს ორი მწკრივი ერთი და იგივე მნიშვნელობის წყვილებით). ამ მნიშვნელობის წყვილების წყვილების სახელები მითითებულია com-ის მეშვეობით PRIMARY KEY საკვანძო სიტყვის შემდეგ. პასუხი უკვე იცით.

ვის ონლაინ მაღაზიაში შეიტანება ამ ცხრილების მონაცემები დამატებითი სკრიპტის გამოყენებით, როგორიც არის ჩემი (როგორიცაა php), ამ დროისთვის მათი ხელით შეყვანა მოგვიწევს. თქვენ შეგიძლიათ შეიყვანოთ ნებისმიერი მონაცემი, მაგრამ გახსოვდეთ, რომ ცხრილთან დაკავშირებული იგივე სვეტების მნიშვნელობა თავიდან იქნება აცილებული. ან დააკოპირეთ ქვემოთ მოცემული დეტალები:

INSERT INTO მოვაჭრეებს (სახელი, ქალაქი, მისამართი) VALUES ("Williams", "Moscow", "Lisova vul., bld. 43"), ("Budinok Druku", "Minsk", "F. Skorini Ave., bld. 18 "), ("BHV-Petersburg", "St. Petersburg", "Yesenina vul., bld.5"); INSERT INTO მომხმარებელს (სახელი, ელ.ფოსტა) ღირებულებები ("ივანოვი სერგეი", " [ელფოსტა დაცულია]"), ("ლინსკა კატია", " [ელფოსტა დაცულია]"), ("დემიდოვი ოლეგი", " [ელფოსტა დაცულია]"), ("აფანასიევ ვიქტორ", " [ელფოსტა დაცულია]"), ("პაზკა ვირა", " [ელფოსტა დაცულია] "); ჩადეთ პროდუქტებში (სახელი, ავტორი) ღირებულებები ("ვირში ხანნიას შესახებ", "ანდრიი ვოზნესენსკი"), ("ნამუშევრების კრებული, ტომი 2", "ანდრიი ვოზნესენსკი"), ("ნამუშევრების კრებული, ტომი 3" , " ანდრეი ვოზნესენსკი"), ("რუსული პოეზია", "მიკოლა ზაბოლოცკი"), ("მაშენკა", "ვოლოდიმირ ნაბოკოვი"), ("ექიმი ჟივაგო", "ბორის პასტერნაკი"), ("ჩვენი", "სერგი დოვლატოვი". ") , ("სტრატას მოთხოვნა", "ვოლოდიმირ ნაბოკოვი"), ("ლოლიტა", "ვოლოდიმირ ნაბოკოვი"), ("ბნელი ხეივნები", "ივან ბუნინი"), ("საჩუქარი", "ვოლოდიმირ ნაბოკოვი") , ("ლიდერის ცოდვა", "იულია ვოზნესენსკაია"), ("ემიგრანტი", "ოლექსი ტოლსტოი"), ("გონებიდან სწრაფად", "ოლექსანდრე გრიბოედოვი"), ("ანა კარენინა", "ლეო ტოლსტოი" ), ("დადასტურების ზღაპრები", "მიკოლა ლესკოვი"), ("ანტონის ვაშლები", "ივან ბუნინი"), ("მკვდარი სულები", "მიკოლა გოგოლი"), ("სამი და", "ანტონ ჩეხოვი") , ("გაქცეული", "ვოლოდიმირ დალი"), ("იდიოტი", "ფიოდორ დოსტოევსკი"), ("ძმები კარამაზოვები", "ფიოდორ დოსტოევსკი"), ("გენერალური ინსპექტორი", "მიკოლა გოგოლი"), (" "Garnet Bracelet", "Olexander Kuprin" ) INSERT INTO incoming (id_vendor, date_incoming) VALUES ("1", "2011-04-10"), ("2", "2011-04-11"), ("3 ", "2011-04-12" ); INSERT INTO magazine_incoming (id_incoming, id_product, რაოდენობა) VALUES ("1", "1", "10"), ("1", "2", "5"), ("1", "3", "7" "), ("1", "4", "10"), ("1", "5", "10"), ("1", "6", "8"), ("1", "18", "8"), ("1", "19", "8"), ("1", "20", "8"), ("2", "7", "10") , ("2", "8", "10"), ("2", "9", "6"), ("2", "10", "10"), ("2", "11" ", "10"), ("2", "21", "10"), ("2", "22", "10"), ("2", "23", "10"), ( "2", "24", "10"), ("3", "12", "10"), ("3", "13", "10"), ("3", "14", "10"), ("3", "15", "10"), ("3", "16", "10"), ("3", "17", "10"); INSERT INTO ფასებში (id_პროდუქტი, თარიღი_ფასის_ცვლილებები, ფასი) VALUES ("1", "2011-04-10", "100"), ("2", "2011-04-10", "130"), ("3 ", "2011-04-10", "90"), ("4", "2011-04-10", "100"), ("5", "2011-04-10", "110") , ("6", "2011-04-10", "85"), ("7", "2011-04-11", "95"), ("8", "2011-04-11", "100"), ("9", "2011-04-11", "79"), ("10", "2011-04-11", "49"), ("11", "2011-04" -11", "105"), ("12", "2011-04-12", "85"), ("13", "2011-04-12", "135"), ("14", "2011-04-12", "100"), ("15", "2011-04-12", "90"), ("16", "2011-04-12", "75"), ( "17", "2011-04-12", "90"), ("18", "2011-04-10", "150"), ("19", "2011-04-10", "140 "), ("20", "2011-04-10", "85"), ("21", "2011-04-11", "105"), ("22", "2011-04-11" ", "70"), ("23", "2011-04-11", "65"), ("24", "2011-04-11", "130"); INSERT INTO sale (id_customer, date_sale) VALUES ("2", "2011-04-11"), ("3", "2011-04-11"), ("5", "2011-04-11") ; INSERT INTO magazine_sales (id_sale, id_product, რაოდენობა) VALUES ("1", "1", "1"), ("1", "5", "1"), ("1", "7", "1" "), ("2", "2", "1"), ("3", "1", "1"), ("3", "7", "1");

ისე, ჩვენს მაღაზიას აქვს 24 სახეობის პროდუქტი, მიწოდებული სამი მომხმარებლისგან სამი მიწოდებიდან და სულ სამი გაყიდვიდან. ყველაფერი მზადაა, შეგვიძლია გავაგრძელოთ ახალი MySQL ფუნქციების დაყენება, რასაც შემდეგ გაკვეთილზე გავაკეთებთ.

მიმდინარე MySQL მონაცემთა ბაზა არ არის კრიტიკული ჩანაწერების რაოდენობისთვის. იშვიათად არის საჭირო რიგ მწკრივებს შორის დასაშვები საზღვრების კონტროლი.

დღესდღეობით ფაქტია, თუ თავად მონაცემთა ბაზის სტრუქტურა ეფუძნება მონაცემებს და შესაბამისი ცხრილი უნდა კონტროლდებოდეს ველში ჩანაწერების რაოდენობაზე და კონკრეტულ ადგილებზე.

ფუნქციის სინტაქსი და აპლიკაციის ვიკი

MySQL count ფუნქცია გამოიყენება უშუალოდ მონაცემთა ბაზაში შესვლისას. ფუნქციას აქვს ჩაწერის მხოლოდ ორი ძირითადი ფორმა: ყველა ჩანაწერი ან მხოლოდ კონკრეტული. არსებობს მხოლოდ ერთი რეალური ფაქტორი - მწკრივი, რომელიც არჩეულია ველის მიერ, რომელიც შედის count() გამოსახულებაში, არ არის გამოწვეული NULL მნიშვნელობით.

ამ აპლიკაციაში MySQL დათვლის ფუნქცია ვიკორიზებულია გონების გარეშე. გაითვალისწინეთ, რომ ცვლადის რაოდენობა (*) უდრის ცხრილის ყველა ჩანაწერს და არ ნიშნავს, რომ ზოგიერთ ჩანაწერს შეიძლება ჰქონდეს NULL მნიშვნელობები. მოითხოვეთ რაოდენობის (*) დამატება, რათა ნახოთ ჩანაწერების ჯამური რაოდენობა, რომელიც შეიძლება მოთავსდეს ცხრილში.

საცალო ვაჭრობას შეუძლია გადაიტანოს შემდეგი ინფორმაცია:

  • დაითვალეთ (...) შედეგად.

Ale von matim უფრო მნიშვნელოვანია, ნაკლებად პრაქტიკული.

უსაფრთხოება PHP & MySQL: count() - პრაქტიკაში

სურსათის უვნებლობა ეძღვნება სპეციალისტების სრულიად კვალიფიციურ ჯგუფს. დღემდე ხდება დარღვევები, თავდასხმები, იკარგება და იპარება ღირებული ინფორმაცია.

და მხოლოდ ორი ყველაზე საიმედო და უსაფრთხო მცველი ნებისმიერი ბოროტმოქმედის გზაზე:

  • იგნორირება;
  • შთაგონების.

პირველი ბარი დამზადებულია ბეტონისგან. შეგიძლიათ წინასწარ გაარკვიოთ რა უნდა გააკეთოთ, მაგრამ თუ არ იცით სად, სად და როგორ, არანაირი ეფექტი არ იქნება. ყოველთვის გვჭირდება კარები, რომლებიც უნდა გაიხსნას, მათი გასაღები ამის გაკეთების მნიშვნელოვანი მიზეზია.

სხვა გადაწყვეტის კონტექსტში, MySQL-ის ფუნქციები count(*) და count(...) იდეალური დაცვის აპლიკაციებია. ნაიგოლოვნა - ეს ფუნქციები გიჟური და პრიმიტიულია. ისინი გაიმარჯვებენ ნებისმიერი გამოსვლისთვის, ჭუჭყიანი, ისე რომ მონაცემთა ბაზა თავად იმუშავებს და მასთან კავშირი დამონტაჟდება.

უსაფრთხოების ცხრილის შექმნით ისე, რომ კომპანიის თანამშრომლის კანის შესვლა/გასასვლელი იყოს მითითებული NULL ან NULL, თქვენ შეგიძლიათ აკონტროლოთ ყველა ის აქტივობა, რომელიც ხდება დღის სამუშაო საათებში. ბუნებრივია, შაბათ-კვირას, არდადეგებზე და სამუშაო დღეს არასამუშაო საათებში, თქვენ უნდა აღადგინოთ უსაფრთხოების ცხრილის ყველა ჩანაწერი NULL მნიშვნელობით.

ასეთი პრიმიტიული ლოგიკის წყალობით შესაძლებელია ნებისმიერი გადაუცემული შემოჭრის აღმოჩენა და დამარცხება უმარტივესი გზით, განსაკუთრებული ხარჯების გარეშე. რაც უფრო მარტივი და შეუმჩნეველია თავდაცვა, მით უფრო ადვილია მასზე შეჭრა.

უმოვი და სპეციალური ეპიზოდები

ქვემოთ მოცემულ მაგალითში არსებობს არგუმენტი, რომ ცხრილის ყველა ჩანაწერი არ მონაწილეობს MySQL დათვლის ოპერაციაში.

ყველა კითხვის ანალიზის შედეგი ადასტურებს გონებას. ამ მიზეზით მე ვიკითხავ:

  • აირჩიეთ param1 + param2 + param3 `ex_count`-დან, სადაც count(*)

თანაბრად ვიკითხავ

  • აირჩიეთ count(*) `ex_count`-დან, სადაც (param1 + param2 + param3) > 0.

MySQL-ის დათვლის ფუნქცია იძლევა დათვლის სხვადასხვა ვარიანტს, მათ შორის ჩადგმულ შეკითხვებში. თუმცა, უპირველეს ყოვლისა, ფრთხილად იყავით: სიმარტივე წარმატების გასაღებია. ამ და სხვა გონებიდან მრავალი ჩანაწერის შენახვის ფუნქცია ძალიან მარტივია, მაგრამ სამუშაო ძალიან რთულია.

უმეტესწილად, არსებობს გარკვეული მინიშნება - "დაცემა" - რაც მარტივ თარგმანში ნიშნავს "რეგულარობას". ასე რომ, count MySQL პლატფორმაზე მარტივი ოპერაციების კონტექსტში, სხვა მოწინავე დეველოპერის გონებას შეუძლია დაამატოს ისეთი ფუნქციონირება, რომელიც არატრანსფერულ სიტუაციაში საერთოდ არ იმუშავებს ისე, როგორც ეს იყო დაგეგმილი.

პატივისცემა! ეს ნაშრომი ეფუძნება თარგმანს „17.1. MySQL 5.0.19 პროგრამული უზრუნველყოფის შენახული რუტინები და საგრანტო ცხრილების ინვენტარი, „საცნობარო სახელმძღვანელო. იგი ადასტურებს MySQL 5.0-დან 5.0.19-მდე. დოკუმენტი გენერირებულია: 2006-01-23 (რევიზია:995)"
”დაუყოვნებლივ წაიკითხეთ ყველაფერი და შემდეგ სცადეთ”

შენახვის პროცედურები არის SQL ბრძანებების ნაკრები, რომელიც შეიძლება შედგენილი და შენახული იყოს სერვერზე. ამრიგად, ფულის დაზოგვის ნაცვლად, რაც ხშირად პრობლემაა, კლიენტებს შეუძლიათ აირჩიონ მსგავსი პროცედურა, რომელიც დაზოგავს ფულს. ეს შეამცირებს პროდუქტიულობას მონაცემების მხოლოდ ერთხელ გაანალიზებით და სერვერსა და კლიენტს შორის ტრაფიკი შეიცვლება. კონცეპტუალური რევანდი შეიძლება გადავიდეს ბიბლიოთეკის სერვერის ფუნქციამდე.

ტრიგერი არის შენახული პროცედურა, რომელიც გააქტიურებულია სიმღერის დაწყებისას. კომპლექტს შეუძლია დააყენოს წბერეჟე პროცედურა, იაკმა მარჯვენა ხელის ნიშანში, როცა ჩანაწერი ჩანს ტრანზაქციის ცხრილისთვის - ისეთი რანგი, რომ ავტომატურად დაივიწყოს დუმების ვიდალენური დუმერი, თუ იოგოს ტრანზიკების აფეთქება ჩანს.

პროგრამების დაზოგვა (პროცედურები და ფუნქციები) მხარდაჭერილია MySQL 5.0-ში. შენახული პროცედურები - SQL ვირუსების ნაკრები, რომელიც შეიძლება შეინახოს სერვერზე. როგორც კი ეს დასრულდება, კლიენტს აღარ სჭირდება მოთხოვნის ხელახლა გაგზავნა, არამედ უბრალოდ უნდა დააჭიროს შენახულ პროგრამას.

ეს შეიძლება იყოს მართალი, თუ:

  • უამრავი კლიენტის პროგრამა იწერება სხვადასხვა ენაზე ან მოქმედებს სხვა პლატფორმებზე, წინააღმდეგ შემთხვევაში აუცილებელია ამ ოპერაციების ერთი და იგივე მონაცემთა ბაზის ანალიზი.
  • უსაფრთხოება 1 თვის განმავლობაში

შენახულმა პროცედურებმა და ფუნქციებმა (ქვეპროცედურებმა) შეიძლება უზრუნველყოს პროდუქტიულობის გაზრდა კლიენტსა და სერვერს შორის საჭირო ინფორმაციის გასაგზავნად. ეს პარამეტრი ზრდის მონაცემთა ბაზის სერვერის ჩართულობას და ამცირებს თითო კლიენტის ღირებულებას. გთხოვთ გაითვალისწინოთ, რომ კლიენტის ბევრ მანქანას (როგორიცაა ვებ სერვერები) ემსახურება ერთი ან მეტი მონაცემთა ბაზა.

შენახული ქვეპროგრამები ასევე საშუალებას გაძლევთ გამოიყენოთ სერვერის მონაცემთა ბაზაში შენახული ფუნქციების ბიბლიოთეკები. ეს შესაძლებლობა წარმოდგენილია მრავალი ყოველდღიური პროგრამისთვის, რომელიც საშუალებას გაძლევთ პირდაპირ დააჭიროთ მათ (მაგალითად, ვიკორის კლასები).

MySQL მიჰყვება SQL:2003-ის სინტაქსს პროცედურების შესანახად, რომელიც უკვე გამოიყენება IBM-ის DB2-ში.

ხედი მარცხნიდან მარჯვნივ...

შენახული დისტანციური ქვეპროგრამების შექმნის, შეცვლისას, სერვერი მანიპულირებს mysql.proc ცხრილით.

MySQL 5.0.3-ით დაწყებული, დაგჭირდებათ შემდეგი უპირატესობები:

რუტინის შექმნაპროცედურების შესაქმნელად, რომლებიც დაცულია

რუტინის შეცვლააუცილებელი ცვლილებები და პროცედურები. ეს პრივილეგია ავტომატურად ენიჭება პროცედურის (ფუნქციის) შემქმნელს.

შეასრულეეს საჭირო იქნება ქვეპროგრამების ინსტალაციისთვის. ტიმი არ არის ნაკლები, ის ავტომატურად ენიჭება პროცედურის (ფუნქციის) ავტორს. ასევე, SQL SECURITY არის პარამეტრი DEFINER ქვეპროგრამებისთვის, რომელიც საშუალებას აძლევს მომხმარებლებს, რომლებსაც აქვთ წვდომა მონაცემთა ბაზაზე, გამოიძახონ მონაცემთა ბაზასთან დაკავშირებული ქვეპროგრამები.

შენახული პროცედურებისა და ფუნქციების სინტაქსი

შენახული ქვეპროგრამა არის პროცედურა ან ფუნქცია. შენახული ქვეპროგრამები იქმნება CREATE PROCEDURE ან CREATE FUNCTION გამონათქვამების გამოყენებით. პროგრამა შენახულია, გამარჯვებული და CALL, და მხოლოდ ცვლილებები, რომლებიც აბრუნებს მნიშვნელობებს, არის ვიკორისტული, როგორც შაბათ-კვირას. ფუნქცია შეიძლება გამოიძახოს ნებისმიერი სხვა ფუნქციის მსგავსად და შეუძლია სკალარული მნიშვნელობის როტაცია. შენახულ ქვეპროგრამებს შეუძლიათ გამოიძახონ სხვა შენახული ქვეპროგრამები.

MySQL 5.0.1-დან დაწყებული, დაინერგა პროცედურა ან ფუნქცია კონკრეტულ მონაცემთა ბაზასთან დასაკავშირებლად. ბევრი მნიშვნელობა აქვს:

  • როდესაც ქვეპროგრამა გამოიძახება, საჭირო იქნება დააწკაპუნოთ USE db_name (და შეინახოთ მონაცემთა ბაზა, თუ ქვეპროგრამა დასრულებულია და მონაცემთა ბაზა აღარ იქნება საჭირო)
  • შეგიძლიათ პირველადი სახელების კვალიფიკაცია მონაცემთა ბაზის სახელებიდან. შეიძლება დაგჭირდეთ მოძებნოთ ქვეპროგრამა, რომელიც არ არის ზუსტ მონაცემთა ბაზაში. მაგალითად, ახალი პროცედურისთვის p, რომელიც შენახულია, ან ფუნქციისთვის f, რომელიც ასოცირდება მონაცემთა ბაზის ტესტთან, შეგიძლიათ უთხრათ ბრძანების თარჯიმანს ასე: CALL test.p() ან test.f() .
  • მონაცემთა ბაზის წაშლის შემდეგ, მასთან დაკავშირებული ყველა ქვეპროგრამა ასევე წაიშლება. MySQL 5.0.0-ს აქვს მრავალი ქვეპროგრამა, რომლებიც გლობალურია და არ არის დაკავშირებული მონაცემთა ბაზასთან. სუნი გაქრება მონაცემთა ბაზის ძიების მიღმა ოპერატორისგან, რომელიც რეკავს. მას შემდეგ, რაც USE db_name შეყვანილია ქვეპროგრამებს შორის, თავდაპირველი ხრახნიანი მონაცემთა ბაზა განახლდება ქვეპროგრამებიდან გასვლის შემდეგ (მაგალითად, ნაკადიანი მონაცემთა ბაზა db_11 დაუყოვნებლივ დააწკაპუნეთ ქვეპროგრამებზე, ისევე როგორც vikorista db_22, გასვლის შემდეგ ქვეპროგრამებს ჩამოერთმევათ_111)

MySQL მხარს უჭერს ფართო გაფართოებებს, რომლებიც საშუალებას გაძლევთ გამოიყენოთ სტანდარტული SELECT გამონათქვამები (კურსორის ან ადგილობრივი ცვლილებების გარეშე) შენახვის პროცედურების შუალედში. შედეგად მიღებული აკრეფა, რომელიც გადაიქცა მოთხოვნად, უბრალოდ პირდაპირ კლიენტს ეგზავნება. მრავალჯერადი SELECT მოთხოვნა არ წარმოქმნის შედეგების კომპლექტს, ამიტომ კლიენტი პასუხისმგებელია ბიბლიოთეკის გამოყენებაზე, რომელიც მხარს უჭერს მრავალი შედეგის კომპლექტს.

პროცედურების შექმნა- შეასრულეთ პროცედურა, რომლის შენახვაც შესაძლებელია.

ფუნქციის შექმნა- შექმენით ფუნქცია, რომელიც შენახულია.

Სინტაქსი:

პროცედურების შექმნაპროცედურის_სახელი ([პროცედურის_პარამეტრი[,...]])
[მახასიათებლები...] სხეულის_ქვეპროგრამები

ფუნქციის შექმნაფუნქციის_სახელი ([function_parameter[,...]])
აბრუნებსტიპი
[მახასიათებლები...] სხეულის_ქვეპროგრამები

procedure_parameter:
[ IN | გარეთ | INOUT] პარამეტრის_სახელის ტიპი
function_parameter:
პარამეტრი_სახელის ტიპი

ტიპი:
როგორიც არ უნდა იყოს MySQL მონაცემები

დამახასიათებელი:
ენა SQL
| დეტერმინისტული
| (შეიცავს SQL | SQL არ არის | კითხულობს SQL მონაცემებს | ცვლის SQL მონაცემებს)
| SQL SECURITY (განმსაზღვრელი | ინვოკერი)
| კომენტარი "სტრიქონი"

body_ქვეპროგრამები:
SQL ვირუსის გასწორება.

მოდით შევხედოთ ყველაფერს პრაქტიკულად.

დავიწყოთ შემდეგი პროცედურით, რომელიც ინახება შემდეგ ეტაპზე:

პროცედურების შექმნა `my_proc`(OUT t INTEGER(11))
არა დეტერმინისტული
SQL SECURITY INVOKER
კომენტარი ""
დასაწყისი
აირჩიეთ val1+val2 "t"-ში `my` LIMIT 0,1;
ᲓᲐᲡᲐᲡᲠᲣᲚᲘ;

LIMIT ვირუსის გამოყენება ამ აპლიკაციაში კეთდება იმის უზრუნველსაყოფად, რომ ნებისმიერ კლიენტს შეუძლია მიიღოს დიდი რაოდენობით შედეგების ნაკრები.

ვის სახელს ვეძახით:

დარეკეთ my_proc(@a);
აირჩიეთ @a;

გარე წყაროდან შიდა ელექტრომომარაგების გასაძლიერებლად, ჯერ გამოიყენეთ მეორადი ელექტრომომარაგების გამყოფი ძირითადიდან (ვიკორისტის ბრძანების შესასვლელად DELIMITER <строка/символ>)

ღერძი კიდევ ერთი კონდახით სარგებლობდა.

Mysql> დელიმიტერი //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> დასაწყისი
-> SELECT COUNT(*) INTO param1 FROM t;
->დასრულება;
-> //

mysql>delimiter;
mysql> CALL simpleproc(@a);
მოთხოვნა კარგია, 0 მწკრივი დაზარალდა (0,00 წმ)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 მწკრივი კომპლექტში (0.00 წმ)

თქვენ შეგიძლიათ გაოცდეთ მთელი პროცესით პატარაზე ქვემოთ:

ტრიგერი

ტრიგერების მხარდაჭერა გამოჩნდა MySQL-ში 5.0.2 ვერსიით დაწყებული.

გამომწვევი- მონაცემთა ბაზის ობიექტის სახელები, რომელიც ასოცირდება ცხრილთან და აქტივები მიმდინარე მწკრივში, ამ ცხრილთან დაკავშირებული მწკრივი.

მაგალითად, ქვემოთ მოცემულ კოდზე დაწკაპუნებით იქმნება ცხრილი და INSERT ტრიგერი. ტრიგერი იძლევა მნიშვნელობას, რომელიც ჩასმულია ცხრილის ერთ-ერთ სვეტში.

Mysql> CREATE TABLE ანგარიში (acct_num INT, თანხა ათწილადი(10,2));
მოთხოვნა კარგია, 0 მწკრივი დაზარალდა (0,03 წმ)
mysql> CREATE TRIGGER ins_sum ანგარიშში ჩასმამდე
-> თითოეული მწკრივის ნაკრებისთვის @sum = @sum + NEW.amount;
მოთხოვნა კარგია, 0 მწკრივი დაზარალდა (0,06 წმ)

გავახმოვანოთ ჯამი და საჭირო მნიშვნელობა 1. ცხრილში ჩასმისას ანგარიშიცვლილების ღირებულება გაიზრდება ჩასმული ნაწილის მიხედვით.

პატივისცემა. თუ ცვლილების მნიშვნელობები არ არის ინიციალიზებული, მაშინ ტრიგერის დამუშავება შეუძლებელია!

ტრიგერის სინტაქსი

ᲨᲔᲥᲛᲜᲐ

ტრიგერი Trigger_time Trigger_time Trigger_use
ON table_name თითო მწკრივისთვის viz_constructed_when_trigger_specified

ვინაიდან ყველაფერი ცხადი გახდა ტრიგერსა და კორისტუვაჩს შორის, მოდით ვისაუბროთ ტრიგერის საათსა და მომენტზე.

გამომწვევი_საათი

მიუთითებს ტრიგერის მოქმედების საათს. BEFORE ნიშნავს, რომ ტრიგერის სროლა ხდება ტრიგერის დასრულებამდე, ხოლო AFTER ნიშნავს შემდეგ. მაგალითად, ჩანაწერების ჩასმისას (საოცარი მაგალითი), ჩვენი ტრიგერი ამოქმედდა ჩანაწერის რეალურ ჩასვლამდე და გამოითვალა თანხა. ეს ვარიანტი შესაფერისია ცხრილის დამატებითი ველების წინასწარი გამოანგარიშებისთვის ან სხვა ცხრილში პარალელურად ჩასართავად.

applicationing_trigger_supply

აქ ყველაფერი უფრო მარტივია. აქ ნათლად არის მითითებული, თუ რა ტიპის ტრიგერს ენიჭება ტრიგერი.

  • INSERT: ეს არის ის. ჩასმის ან მსგავსი ტიპის ოპერაციების დროს (INSERT, LOAD DATA და REPLACE)
  • განახლება: თუ არსი (რიგი) შეცვლილია
  • DELETE: თუ ჩანაწერი წაიშლება (დაწერეთ DELETE და/ან REPLACE გამონათქვამების ჩანაცვლებისთვის)