【问题标题】:Should I disable MySQL strict mode?我应该禁用 MySQL 严格模式吗?
【发布时间】:2011-04-03 08:20:22
【问题描述】:

我一直在一个启用了 MySQL 严格模式的网站上工作。一个人有一个很长的用户代理字符串记录在我们的日志表中,不幸的是,用户代理字符串超出了列的限制,因此引发了警告。根本没有插入数据。

为了避免这样的麻烦,我应该禁用 MySQL 严格模式还是我应该自己想出一些东西(我正在使用 PHP)?

【问题讨论】:

  • 您可以在插入之前在应用程序级别检查字符串的长度。
  • @Pekka:你会如何合理地做到这一点?我不想在软件上到处调用方法。
  • 好吧,您大概必须在某个地方转义传入的数据。一个substr() 可以工作并且不会增加太多的混乱。如果您的应用程序以其他方式使用严格模式(这很好),我会走那条路并保持模式不变

标签: php mysql strict-mode


【解决方案1】:

在将数据插入数据库之前验证数据。如果字符串太大而无法放入您的表中,则可能是您的列太窄,或者数据无效。您需要决定是在存储之前截断它,还是做一些错误报告,或者两者兼而有之。

不要不要关闭 DBMS 的安全功能,这是完全错误的做法。

【讨论】:

  • 我希望你能在那个“不”上加粗一点。如果你能把 MySQL 的严格度提高到 11,那就太好了。
  • 我并不认为服务器模式是一项安全功能。虽然我猜这取决于您对安全功能的定义
  • @ChrisWue:我认为“不会默默地破坏您的数据”是一项安全功能。
  • 在我看来,DBMS 应该拒绝无效数据。总是。有时不是inserts adjusted values for invalid or missing values。我不喜欢魔术发生。但您也是正确的,可以对应用程序进行编码以考虑到这一事实。
【解决方案2】:

您宁愿静默截断您的数据(可能导致数据损坏)还是至少想知道您有问题?

我建议启用严格模式并在 PHP 中检查您的数据。您的 PHP 应用程序知道或至少应该知道如何处理太长的字符串。如果您关闭严格模式并将该决定留给 MySQL,那么 MySQL 将默默地截断您的字符串,最终您将得到一个充满垃圾的数据库。

更改和修复代码很容易,修复损坏的数据通常是不可能的。

如果你禁用严格模式,你最终会遇到如下奇怪的问题:

VARCHAR(4) storing more characters than four

【讨论】:

    【解决方案3】:

    好吧,你可以在禁用严格模式的情况下尝试它,看看效果如何,我从来没有遇到过禁用它的问题,但要小心。

    但是,如果长用户代理是严格模式的唯一问题,并且您没有直观地阅读它们,那么我建议您只散列您的 UA 或增加字段长度。

    【讨论】:

      【解决方案4】:

      如果您有需要这样做,查询失败,并且您没有知识或预算来解决它 - 那么是的。

      如果有人问这是如何正确禁用严格模式,只需在 MySQL 配置中添加:

      sql_mode=NO_ENGINE_SUBSTITUTION
      innodb_strict_mode=0
      

      【讨论】:

        猜你喜欢
        • 2018-07-19
        • 2016-10-24
        • 2021-12-14
        • 2011-08-26
        • 2021-03-09
        • 2010-12-23
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多