MySQL: @ ауыспалы айнымалы. Бұл айырмашылық неде?

Мен жіберген тағы бір сұраққа біреу маған:

 @variable 

және

 variable 

mysql ішінде. Ол сондай-ақ, MSSQL-дегі пакеттік доменнің қалай екендігін және MySQL сеанс домені бар екенін атап өтті. Маған бұл түсіндіруге бола ма?

430
18 июня '09 в 2:04 2009-06-18 02:04 DJTripleThreat компаниясы 18 маусымда 2:04 орнатқан 2009-06-18 02:04
@ 4 жауаптар

MySQL де пайдаланушы анықтайтын айнымалы мәндері бар .

Олар сеанстағы бір жерде баптандыруға болатын және сеанс аяқталғанға дейін өз құндылығын сақтауға болатын еркін айнымалылар түрінде жазылады.

Олар @ белгісімен қосылады, мысалы: @var

Бұл айнымалы мәнді SET сөзі немесе сұрау барысында инициализациялауға болады:

 SET @var = 1 SELECT @var2 := 2 

MySQL сақталған процедураны жасаған кезде MySQL кіріс параметрлерін беріп, жергілікті айнымалы мәндерді жариялай аласыз:

 DELIMITER // CREATE PROCEDURE prc_test (var INT) BEGIN DECLARE var2 INT; SET var2 = 1; SELECT var2; END; // DELIMITER ; 

Бұл айнымалылар префикстермен қосылмаған.

Процедура айнымалысы мен пайдаланушы анықтайтын айнымалы арасындағы айырмашылық рәсімнің айнымалы мәні рәсім шақырылатын сайын NULL үшін қайтадан іске қосылады, ал сеансқа тәуелді айнымалы үшін ешқандай мән жоқ:

 CREATE PROCEDURE prc_test () BEGIN DECLARE var2 INT DEFAULT 1; SET var2 = var2 + 1; SET @var2 = @var2 + 1; SELECT var2, @var2; END; SET @var2 = 1; CALL prc_test(); var2 @var2 --- --- 2 2 CALL prc_test(); var2 @var2 --- --- 2 3 CALL prc_test(); var2 @var2 --- --- 2 4 

Көріп отырғаныңыздай, var2 (рәсім айнымалысы) процедура шақырылған сайын және @var2 ( @var2 тәуелді айнымалы) болғанда қайтадан инициализацияланған.

(MySQL-те, айнымалы @@global.port , @@global.port немесе «сессия айнымалы мәндері» сияқты «жаһандық айнымалылар» болуы мүмкін алдын ала анықталған «жүйелік айнымалылар» бар, мысалы, « @@session.sql_mode , бұл «сессия айнымалылары» пайдаланушымен анықталған пайдаланушы анықтайтын айнымалылармен байланысты.)

539
18 июня '09 в 2:39 2009-06-18 02:39 жауап Quassnoy беріледі 18 маусым '09 2:39 2009-06-18 02:39

MySQL-де @variable пайдаланушы айнымалысын анықтайды . Сіз өзіңізді анықтай аласыз.

 SET @a = 'test'; SELECT @a; 

Сақталған бағдарламалардың сыртында @ айнымалысы - сіз өзіңізді анықтай алмайтын жүйе айнымалысы .

border=0

Бұл айнымалының ауқымы - бүкіл сеанс. Бұл дерекқордың қосылымы бар болса да, айнымалыны әлі де қолдануға болатындығын білдіреді.

Бұл MSSQL-мен қарама-қайшы, онда айнымалы тек ағымдағы сұрыптауларда қол жетімді болады (сақталған рәсім, сценарий немесе басқаша). Сол сессияда басқа топтамада қол жетімді болмайды.

63
18 июня '09 в 2:18 2009-06-18 02:18 Жауап 18 маусым күні сағат 18 : 00- де 2: 30- дағы моль арқылы өтеді

MSSQL процедуралардағы айнымалы мәндер DECLAREd болуын талап етеді және адамдар @ Variable синтаксисін пайдаланады (DECLARE @ TEXT VARCHAR (25) = 'text'). Бұған қоса, MS сізге кез келген блокта рәсімдерді жариялауға мүмкіндік береді, бұл менің барлық DECLARE-ді жоғарыдан талап ететін mySQL-қа қарағанда.

Командалық жолда жақсы болғанда, mySQL-та сақталған процедуралардың ішіндегі «set = @variable» пайдалану қауіпті деп ойлаймын. Көріну шегінде шекаралар мен айнымалылар жоқ. Бұл жаһандық аттар кеңістігі және күтпеген қақтығыстар мен жазуларды жасайтын «var» префиксі жоқ жарияланған JavaScript айнымалыларына ұқсас.

MySQL-тағы жақсы адамдар, DECLARE @ Variable-ті әр түрлі деңгейдегі блоктарда сақтауға мүмкіндік береді деп үміттенемін. Назар аударыңыз @ (белгісінде). @Sign префиксі кесте бағанының атауларынан айнымалы атауларды бөлуге көмектеседі, себебі олар жиі бірдей болады. Әрине, әрқашан «v» немесе «l_» префиксін қосуға болады, бірақ @ белгісі айнымалы атауды бағанмен салыстырудың ыңғайлы және қысқа жолы болып табылады, оның көмегімен деректерді құлатпай-ақ алып тастай аласыз.

MySQL - сақталған процедуралар үшін жаңа және олар бірінші нұсқасы үшін жақсы жұмыс жасады. Бұл жерде өздерінің пішінін қайда алуға болатындығын және сервер тарапынан тіл аспектілерін қадағалауды сұрайды.

9
24 марта '11 в 6:38 2011-03-24 06:38 жауапты Xybo 24 наурызда '11 уақытында 6:38 2011-03-24 06:38

Негізінен мен сақталған рәсімдерде UserDefinedVariables (@ қосылған) пайдаланамын. Бұл өмірді жеңілдетеді, әсіресе екі немесе одан көп сақталатын процедураларға осы айнымалы мәндер қажет болғанда. Мен айнымалы ONE сақталған рәсімде ғана қажет болғанда, Жүйе айнымалы мәнін (@ префикссіз) пайдаланамын.

@Xybo: Мен StoredProcedures ішіндегі @variables пайдалану қауіпті болуы керек екенін түсінбеймін. Сіз «сфера» мен «шекараны» біршама жеңілірек түсіндіре аласыз ба?

3
28 апр. жауап 28 сәуірде Петр береді 2014-04-28 00:52 '14 сағат 0:52 2014-04-28 00:52