在另一个问题中,我发了一个帖子,有人告诉我:
ZZU1
还有:
ZZU1
和MySQL。他还提到了MSSQL如何具有批处理范围和MySQL如何具有会话范围。有人能为我详细解释一下吗?
有用户定义变量的概念。
这些变量在届会结束时可能是初始化的,并保持其价值。
他们准备了一个@Sign,like this:@var
您可以用SET初始化此变量。
ZZU1
当你在MySQL中制定一个存储程序时,你可以输入参数并声明本地变量:
这些变量没有预先准备。
一个程序变量与一个特定的用户定义变量之间的区别在于,程序变量被重新引入NULL程序的每一次都被称为程序,而会话具体变量不是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| |
如你所见,程序变量每次都被重新命名,而@var2(会话特异变量)不被命名。
(In addition to user-defined variances,mysql also has some predefined"system variances",which may be"global variances"such as @@global.portor"session variances"such as @@session.sql_mode;these"session variances"are unrelated to session-specific user-defined va
- 还要注意,有可用的全局变量:例如,请参阅SELECT @@version;。这也是为什么使用DELIMITER @@不是一个好主意的原因。
- 它为新来者提出了新的问题…"var=var"和"var:=var"之间有什么区别吗?
- @confiq:没有。
- 新来者的另一个问题。建议何时使用@vs不使用?
- @皮克斯:你期待什么样的答案?
- @quassnoi如果您将一个用户变量定义为会话变量并设置一个值,它是否会污染下一个使用相同变量名的存储过程调用?
- @皮克斯:是的。
- @那么Quassnoi最好不要使用会话变量吗?为什么每个人都用它?
- @PixelFreak:有时在函数调用之间保存状态很有用。例如,它允许运行分层查询。
- @对…有时。我想我现在所处的位置是,不使用"@"有什么害处吗?
- @皮克斯:再说一次,你期待什么样的答案?
- 所以@variables是static变量。知道了。
- 别忘了你的;的!
- @ MCHL EDCOX1(24)是冷却器(对于C++程序员)。以东十一〔二十五〕是为世俗而设的。
- @confiq,@quassnoi::=和=之间有一个显著的区别,即:=在任何地方都作为变量赋值运算符工作,而=在SET语句中仅以这种方式工作,在其他地方都是比较运算符。因此,SELECT @var = 1 + 1;将保持@var不变,并返回一个布尔值(1或0取决于@var的当前值),而SELECT @var := 1 + 1;将@var改为2,并返回2。
- @波波波波,为什么有两个角色?一个更简单:delimiter $。
- @quassnoi,我们如何设置变量@var的类型?
- @起搏器:通过给它赋值。用户变量可以从一组有限的数据类型中分配一个值:整数、十进制、浮点、二进制或非二进制字符串,或空值。如果引用的变量尚未初始化,则该变量的值为空,字符串类型为。
- @Quassnoi,是否有一种语法来显式地说明类型,类似于我们在declare i int中所使用的类型?
- @不,没有。
- @quassnoi,是否有任何方法来区分用户定义的变量(已设置为NULL和未使用的变量(如EDOCX1〔4))?
- @pacerier:隐式声明的变量具有BLOB类型。如果将其设置为类型化的空值,它将接受空值的类型。
- @quassnoi是系统变量总是由@@进行,还是@@只是指定全局范围?
- 拒绝使用未解释的语法。:=与=的区别??
- @格林:每次你看到你不懂的语法时,你会投反对票吗?它在这里:dev.mysql.com/doc/refman/5.7/en/non-typed-operators.html
在MySQL中,@variable表示一个用户定义的变量。你可以自己定义。
在存储程序之外,一个没有@的系统是一个可变的系统,你无法自定义。
这个变量的范围是整个会话。这意味着当您连接到数据库时,变量仍然可以使用。
This is in contrast with MSQL,where the variable will only be available in the current batch of queries(stored procedure,script,or otherwise).在同一届会议上,在不同的批量中无法找到。
- 不要与会话变量混淆,会话变量的缩写是SET @@a = 'test';,参见dev.mysql.com/doc/refman/5.1/en/set-statement.html。
- @它们被称为系统变量,而不是会话变量。
- @我看错了医生吗?要显式地指示变量是会话变量,请在其名称前面加上session、@@session.或@@。"
- 你不能自己定义系统变量,这可能是真的,但是这个答案使它听起来像所有没有@的变量都是系统变量。这与Quassnoi接受的答案相矛盾,其中var2是用户定义的变量,没有@。我错过什么了吗?
- @Larsh,在Quassnoi的回答中,var2是一个存储过程变量,而不是会话变量。用户定义的会话变量必须以@开头。
- @罗布,你读错了。通读整个段落,而不仅仅是要点内的段落。简单地说,有两种会话变量:1)用户定义的会话变量,2)系统?-定义的会话变量。不能使用@@设置用户定义的会话变量。例如,set@@my_var=1、set@@session.my_var=1和set session my_var=1不能工作,因为my_var不是系统变量,而我们可以执行set@@big_tables=1、set@@session.big_tables=1和set session big_tables=1,因为big_tables是系统变量。
- @Pacerier:那么这个答案听起来应该说"存储程序之外,没有@的variable是一个系统变量,你不能定义自己。"我会进行编辑,希望如果我仍然误解了一些东西,一个知识更丰富的人会纠正我。
- @Larsh"存储程序之外"是什么意思?这是唯一一句我很难理解的话。谢谢!
- @Govindrai:在Quassnoi的回答中,var2是一个没有@前缀的变量,但它不是一个系统变量:它是一个过程变量。这是允许的,因为它在存储过程(也就是说,存储程序)中。在存储过程之外,没有@的变量是系统变量。
MSSQL requires that varias within procedures be declared and folks use the@variable syntax(declare@text varchar(25)=text').此外,MS allows for declares within any block in the procedure,unlike mysql which requires all the declares at the top.
当指挥线上的好东西,我感觉使用"set=@variable"在Mysql的存储程序中是危险的。在范围界限之外没有任何范围和变量。This is similar to variables in Javascript being declared without the"Var"prefix,which are then the global namespace and create unexpected collistions and overwrites.
我希望Mysql的好民谣能够在一个存储程序中在不同的区块层次上发表可变的声明。Notice the@(at sign).The@sign prefix helps to separate variable names from table column names-as they're often the same.在课程中,一个人可以添加一个"V"或"L"prefix,但@sign是一个手法和简短的方式,可以使变量名称匹配Column,你可以在没有克隆的情况下从中提取数据。
MySQL是新来保存程序的,他们为自己的第一个版本做了一份好工作。这将是一个很好的机会,让我们看看他们把它带到了什么地方,看看语言成熟的服务器侧面。
在原则上,我使用了在存储程序中使用的FinedVarians(predended with@)。这使生活容易,特别是当我需要这些变量在两个或更多的储存程序。当我只需要一个存储程序中的变量,而不是使用一个变量系统(不准备@)。
@XYBO:我不明白为什么在存储程序中使用@variables应该是危险的。你能解释一下"范围"和"边界"吗?
- 这违反了基本的软件工程原理。请不要编写另一行代码,除非您确切知道什么是范围,以及为什么使用全局变量通常是一个糟糕的想法。当我学习101个编程课程时,我记得几乎所有的东西都使用一个全局函数会导致一个自动的"f"。有一些特殊的例外,但作为一般规则-只是不要这样做!
- 为什么?-@变量在每个MySQL书籍中都是非常常见的。
- 当然,在一个没有函数调用、过程、触发器等的"平面"脚本中,如果您只是要执行这个简单的脚本或一组有限的命令,然后结束会话(从而破坏全局)。如果是那样的话,你可以继续使用它们。但不要在函数中使用它们!如果你简单地用谷歌搜索全局变量或范围,你会立刻发现他们普遍不受欢迎这一想法的巨大支持。这里有一个起点:wiki.c2.com/?Globalvariablesarebad或更一般的解释:en.wikipedia.org/wiki/global_variable
- 请注意,SQL,尤其是MySQL,甚至是入门级的"程序员"使用。所以你的SQL for Dummies书不会涉及更严肃的工程原理。但是,如果您知道如何编写非常强大和复杂的SQL,就可以编写。如果你打算这样做,你应该注意这些普遍的原则,以避免把自己的脚射伤。
- 很高兴知道我不使用全局变量。据我所知,它们可以在变量名之前通过关键字GLOBALS或@@进行标识。
- 在MySQL中,@变量是全局的。这很容易得到证实。在函数外部设置一个,然后在函数内部对其进行计算。相反,在函数内部设置一个,并在函数外部对其进行计算。您将看到函数不保护这样的范围。他们互相踩脚趾。
- 直接来源:You can store a value in a user-defined variable in one statement and refer to it later in another statement. This enables you to pass values from one statement to another...User variables are written as @var_namedev.mysql.com/doc/refman/5.7/en/user-variables.html
- 使用mysql术语,@@GLOBAL变量更具有全局性和隐蔽性。他们交叉训练!@variables有"会话范围",因此至少他们以这种方式被限制。但是,在您所称的"全局"范围内的任何正常语言中(当它们跨函数等)。"global"的mysql概念应该称为"universal",因为它超出了运行它的进程的边界。"全局"通常不能在标准语言中这样做,因为进程不共享内存空间。这源于SQL的持久性(与易失性)趋势。
- 如果我设计了MySQL语言,我将允许在没有声明的情况下使用@var,但在隐式本地作用域中,@@globals将跨函数,但具有会话作用域,@@persisten将跨会话。不幸的是,他们不是这样做的…
- MySQL源代码this enables you to pass values from one statement to another的引用有一个重要的细微差别。重点是在statements之间共享价值。不管是什么头骨的原因,他们把这个扩展到交叉功能。