【问题标题】:Changing MySQL mode per session更改每个会话的 MySQL 模式
【发布时间】:2016-05-18 08:00:11
【问题描述】:

我有一个支持旧应用程序的开发人员要求我将 MySQL 模式从全局更改为严格模式 - 但是我们在同一台服务器上还有几个其他数据库显然需要严格模式。

我相信可以在会话级别更改模式,我已经尝试了以下代码来做到这一点。

session_start();

include_once("./includes/conn.php");
mysql_query("SET SESSION sql_mode = ''");

但这似乎不起作用 - 测试模式报告返回的全局值和会话值是相同的。

session User : name
session Security : 27478239

MySQL server version : 5.5.5-10.0.23-MariaDB
GLOBAL : STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
SESSION : STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

是否可以在会话级别(或数据库级别)更改 SQL 模式,如果可以,如何实现?

【问题讨论】:

  • 请停止使用mysql_函数,开始使用msyqli或pdo!
  • 是的,that's the syntax。它究竟是如何不符合您的要求的?
  • @davejal 这是一个可以追溯到 2001 年的应用程序,开发人员和我正在支持它,并且很快就会被一个维护得当的工具所取代。与此同时,我必须想办法。
  • @ÁlvaroGonzález 如果我在 login.php 中使用 SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION',然后 modetest.php(仅显示设置)显示 GLOBAL : STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION SESSION : STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
  • 好吧,你必须读回会话值(不是全局值),并且必须从同一个会话中执行。

标签: php mysql restriction strict


【解决方案1】:

two syntaxes(嗯,actually three)来改变一个会话值,所有这些都应该是等价的:

SET SESSION sql_mode = '';
SET @@SESSION.sql_mode = '';
SET @@sql_mode = '';

要读回值:

SELECT @@SESSION.sql_mode;
SELECT @@sql_mode;

当然,既然是会话值:

  • 不会影响全局设置
  • 它不会在当前会话之后继续存在
  • 不会泄露给其他会话

【讨论】:

  • 这似乎让我们成功了一半,但变化并不成立。如果我们运行测试文件,它对全局和会话的显示仍然相同。
  • 是否有可能是您运行了错误的验证码,或者您是在另一个会话中进行的?你有点不情愿:-?
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
相关资源
最近更新 更多