我想要一个不同于全局 sql_mode 的默认会话 sql_mode。
我可以手动设置,但我想自动设置。
我以为我可以将它添加到.my.cnf,但这不起作用。我尝试将它添加到 中的[mysql]组中.my.cnf,它没有抛出错误。
然而,当我连接会话 sql_mode 时,会话仍然继承全局 sql_mode。
我正在使用 MySQL 5.5.16。
只要有问题的帐户没有SUPER权限,您就可以使用全局服务器变量来完成此操作init_connect,即...
由服务器为每个连接的客户端执行的字符串。该字符串由一个或多个 SQL 语句组成,由分号字符分隔。
这是全局服务器配置的一部分,在处理每个新客户端连接发送的第一个查询之前立即执行(具有 的用户除外SUPER,因为如果您破坏了它,否则您将无法登录以修复它)。
该init_connect内容是由服务器对所有非执行SUPER用户......但是,我们可以构建一个CASE表达式,它使用的通过登录的用户身份CURRENT_USER()的功能和计算结果为相应sql_mode的用户,否则使用默认值。
表达式可能是这样的:
mysql> SET @@sql_mode = CASE CURRENT_USER()
WHEN 'usera@%' THEN 'TRADITIONAL' # this user gets 'TRADITIONAL'
WHEN 'userb@localhost' THEN 'ANSI' # this user gets 'ANSI'
ELSE @@sql_mode # everybody else gets the default value,
END; # from global sql_mode
Run Code Online (Sandbox Code Playgroud)
获得所需的表达式后,将其包装在字符串中并将其分配给全局变量init_connect。
mysql> SET GLOBAL init_connect =
"SET @@sql_mode = CASE CURRENT_USER()
WHEN 'usera@%' THEN 'TRADITIONAL'
WHEN 'userb@localhost' THEN 'ANSI'
ELSE @@sql_mode
END;";
Run Code Online (Sandbox Code Playgroud)
然后可以将相同的内容添加到[mysqld]my.cnf的部分,以使您的配置在重新启动后保持不变,尽管您几乎肯定必须删除我添加的空格以提高可读性并可能调整引用。
在 MySQL 服务器 5.5.30 上测试。我试图对这是否对初始连接时间或第一次查询执行时间有任何重大影响进行基准测试,我的结论是,如果有影响,它肯定在亚毫秒范围内,并且太短而无法在系统上识别测试。
| 归档时间: |
|
| 查看次数: |
5338 次 |
| 最近记录: |