如何强制 MySQL 退出传统模式?

Posted

技术标签:

【中文标题】如何强制 MySQL 退出传统模式?【英文标题】:How to force MySQL out of TRADITIONAL mode? 【发布时间】:2011-05-17 16:45:02 【问题描述】:

我有一个旧应用程序在从 mysql 5.0 升级到 5.1 后开始失败。

一些研究表明这是由于“严格模式”防止插入某些类型的“无效”值,这些值以前只是自动转换为合理的值。

我尝试了SET @@SESSION.sql_mode = ''SET @@GLOBAL.sql_mode = '',但仍然出现错误。

还尝试在my.ini 中注释掉sql_mode

是否有更强大的“核”选项来解决此问题?

【问题讨论】:

那些 合理的 替换包括日期为 '0000-00-00'、外键为 0、ENUM 字段中的空字符串......根据我的经验,这往往使一切复杂化,因为像WHERE start_date IS NULL 这样的东西不能按预期工作,你必须求助于WHERE start_date IS NULL OR start_date='0000-00-00'。您应该使用适当的 SQL 模式修补您的生产环境,但还要在您的开发框中强制执行严格模式并尝试修复应用程序。 【参考方案1】:

要允许无效日期,您需要:

SET sql_mode = 'ALLOW_INVALID_DATES';

但你最好修复你的应用程序。

【讨论】:

【参考方案2】:

在我的应用程序中,我通常通过发出来确保 MySQL 连接使用的是传统模式

SET SESSION sql_mode = 'ANSI_QUOTES,TRADITIONAL'

在每个新连接上。我想如果你只是发出

SET SESSION sql_mode = ''

在每个新连接上,您都会解决问题。

您应该能够通过发出来更改新连接的默认 SQL 模式

SET GLOBAL sql_mode = ''

但您必须使用具有足够权限的帐户才能执行此操作,否则将无法正常工作。

我认为,如果您想确保某个特定的 SQL 模式在您的应用程序中运行,最可靠的方法是为每个新连接设置它。

【讨论】:

谢谢...显然我的问题是语法。 SET SESSION sql_mode 有效,但 SET @@SESSION.sql_mode 无效。看起来我必须把它放到每个存储过程中。 您不必将其放入每个存储过程中。执行存储过程时,SQL 模式会临时更改为定义该过程时生效的 SQL 模式。您可以使用您选择的有效 SQL 模式重新定义每个存储过程,作为一次性的事情。或者,如果您有一个具有足够权限的帐户,您可以对相关的 INFORMATION_SCHEMA 表运行 UPDATE 查询来更改您的过程的 SQL 模式设置。

以上是关于如何强制 MySQL 退出传统模式?的主要内容,如果未能解决你的问题,请参考以下文章

centos下修改文件后如何保存退出

linux如何退出vi

vim编辑

第十期新手教程:macOS系统强制退出程序方法

vi编辑器

iOS,先强制退出应用,点击接收通知banner后,应用启动失败