mysql 变量设置问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 变量设置问题相关的知识,希望对你有一定的参考价值。
mysql 变量设置好后再cmd输入后,说mysql不是内部或外部命令是怎么回事????
我是按照百度win8.1mysql安装的,,,
mysql变量的术语分类:
1.用户变量:以"@"开始,形式为"@变量名"
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
2.全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名 或者 set @@global.变量名,对所有客户端生效。只有具有super权限才可以设置全局变量
3.会话变量:只对连接的客户端有效。
4.局部变量:作用范围在begin到end语句块之间。在该语句块里设置的变量
declare语句专门用于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量
通俗理解术语之间的区别:
用户定义的变量就叫用户变量。这样理解的话,会话变量和全局变量都可以是用户定义的变量。只是他们是对当前客户端生效还是对所有客户端生效的区别了。所以,用户变量包括了会话变量和全局变量
局部变量与用户变量的区分在于两点:
用户变量是以"@"开头的。局部变量没有这个符号。
定义变量不同。用户变量使用set语句,局部变量使用declare语句定义
作用范围。局部变量只在begin-end语句块之间有效。在begin-end语句块运行完之后,局部变量就消失了。
所以,最后它们之间的层次关系是:变量包括局部变量和用户变量。用户变量包括会话变量和全局变量。
使用备忘,set @var 若没有指定GLOBAL 或SESSION ,那么默认将会定义用户变量
两种方式定义用户变量:
1."=",如 set @a =3,@a:=5
2.":="。select常常这样使用
总结:使用select 和set设置变量的区别,set可以使用以上两种形式设置变量。而select只能使用":="的形式设置变量
实践积累:用户变量在mysql客户端退出后,会自动消失。之后我打开客户端,使用"select @a;" 显示变了的值为null。说明,未定义的变量初始化是null
实际中的问题
设置常量对group_concat()的配置影响:
SET @@GROUP_CONCAT_MAX_LEN=4
手册中提到设置的语法是这样的:
SET [SESSION | GLOBAL] group_concat_max_len = val;
以下两种形式都能达到达到同样的效果,但是有什么区别?
SET @@global.GROUP_CONCAT_MAX_LEN=4;
global可以省略,那么就变成了:SET @@GROUP_CONCAT_MAX_LEN=4;
2011.2.25
之前的理解不怎么准确。现在对加深理解后的地方进行总结。
mysql中变量的层次关系是:大体包括用户变量和系统变量。系统变量包括系统会话变量和系统全局变量。
相互之间的区别:
因为用户变量就是用户定义的变量,系统变量就是mysql定义和维护的变量。所以,用户变量与系统变量的区别在于,是谁在管理这些变量。mysql一启动的时候就会读取系统变量(这样做目的是可以确定mysql的以何种机制或模式运行)。 系统会话变量与用户变量都是在当前客户端退出后消失。他们之间的区别可以这样理解,虽然常常看到"set @@varible"的形式去改变系统变量的值,但是并不涉及到定义系统变量。用户变量是可以自己定义(初始化)。系统变量按照只是在改变值。
局部变量只在begin-end语句块中定义并有效。执行到该语句块之后就消失了。定义的方式有明显的特点,使用declare语句。
使用系统变量理论上是可以使用两种形式:
前面带有符号"@@"
符号省略。比如我会看的如下形式:CURRENT_USER。但是,约定系统变量要使用"@@变量名"的形式,就是在前面加上符号"@@"
d:\mysql\bin\mysql.exe -h 127.0.0.1 -u root -p 参考技术B http://blog.csdn.net/shichunle/article/details/6978594在网上看到的文章,觉得介绍的不错,推荐给你。 参考技术C
全局变量的修改会保存在两处:
数据⽬录下的 mysqld-auto.cnf持久化信息以 json 格式保存,metadata 记录了这次修改的用户及时间信息。文件中还区分了变量的类型:mysql_server(动态变量)和 mysql_server_static_options(只读变量);
在数据库启动时,会首先读取其他配置⽂件,最后才读取 mysqld-auto.cnf 文件。不建议⼿动修改 mysqld-auto.cnf ⽂件,其可能导致数据库在启动过程中因解析错误⽽失败。如果出现这种情况,可⼿动删除 mysqld-auto.cnf ⽂件或设置 persisted_globals_load 为 off 来避免该⽂件的加载。
2. 表 performance_schema.persisted_variables
通过连接字符串或连接对象设置 MySQL 变量?
【中文标题】通过连接字符串或连接对象设置 MySQL 变量?【英文标题】:MySQL variable setting through connection string or connection object? 【发布时间】:2016-09-26 00:39:27 【问题描述】:这是一个人为的例子,但为了便于解释,我对其进行了简化。
在您投入过多资金之前,请在底部查看我的更新 时间!
背景
我有一些(很多)代码通常如下查询我的数据库:
SELECT name FROM sites where IsLive=1;
我的挑战是,在某些条件下,返回完整网站列表,基本上
SELECT name from sites;
我不希望修改发出 SQL 的实际 C# 代码(尽管我可以这样做,以实现纯粹用于演示目的的目标)。
因此,为了尽可能保持原样,我的想法是插入一个名为 site 的 database-proxy-view
,它返回依赖于 control variable
方法
-
将现有的
site
表重命名为site_table
创建一个名为site
的新视图,C# 代码现在会在不知不觉中将其作为目标,并根据control variable
值从site_table
返回(可能已过滤的)详细信息(请注意视图中的变量意味着我必须创建一个函数来证明这一点 - 请参阅 http://dev.mysql.com/doc/refman/5.7/en/create-view.html wrt 错误 1351)
所做的更改
ALTER TABLE site RENAME TO site_table;
CREATE FUNCTION controlVariableFn() RETURNS VARCHAR(16) RETURN @controlVariable;
CREATE OR REPLACE VIEW site AS SELECT * from site_table WHERE (IsLive = 1 OR controlVariableFn() = 'SHOWALL');
上面的语句丑但是达到了我想要的结果,但是我的问题是动态地通过controlVariable
而不改变我发送的主要SQL查询。
我的问题
有没有办法(理想情况下,当我创建连接对象时)在要执行的实际 SQL 之外定义 controlVariable
,但 View 仍然可以像上面一样访问它它已作为常规用户变量参数提供给查询?
所以代码看起来像
var connectionString = "Server=localhost;User ID=un;Password=pw;Database=dbname;....";
DbConnection db = new MySql.Data.MySqlClient.MySqlConnection
(connectionString, "controlVariable=SHOWALL");
var results = db.Query<Site>("SELECT * FROM site;");
(我知道这不是一个明智的永久解决方案)
更新 如上所述,我的首选解决方案对我不起作用,因为一旦我进入我的数据访问层,因为结果集将 基本上被再次过滤回原始集合。在某些情况下,它 可以工作;这将取决于发出的 SQL(例如,当折叠一个 结果集下来,而不是像我一样尝试扩展结果集 试图在这里做)。 在这方面,我不再在这里寻找答案,而是将其作为首选选项和指南留给后代 - 无论如何,谢谢。
【问题讨论】:
【参考方案1】:如果您不想编辑 c# 代码,则必须将变量存储在数据库中,尽管我不确定您将如何不编辑代码。 如果您愿意编辑代码,则可以访问辅助配置表,该表将包含您希望用户传递给视图的设置。接受这个并允许用户选择他们想要的,然后通过应用程序将其传递给视图。
【讨论】:
谢谢@Shon - 这是一个有用的建议,我没有想到,虽然我需要将后续查询与存储的变量相关联,但我不确定我会如何做到这一点。我能够编辑代码,我只是想避免编辑 existing 查询。所以你的想法符合我的标准。我也想知道不同类别的用户是否可以有不同的连接字符串来访问自定义 site 视图。如果可行,我将对此进行更多考虑并回帖。以上是关于mysql 变量设置问题的主要内容,如果未能解决你的问题,请参考以下文章