我一直在一个启用了 MySQL 严格模式的网站上工作。一个人有一个很长的用户代理字符串记录在我们的日志表中,不幸的是,用户代理字符串超出了该列的限制,因此引发了警告。根本没有插入数据。
为避免此类麻烦,我应该禁用 MySQL 严格模式还是应该自己想出一些东西(我正在使用 PHP)?
我一直在一个启用了 MySQL 严格模式的网站上工作。一个人有一个很长的用户代理字符串记录在我们的日志表中,不幸的是,用户代理字符串超出了该列的限制,因此引发了警告。根本没有插入数据。
为避免此类麻烦,我应该禁用 MySQL 严格模式还是应该自己想出一些东西(我正在使用 PHP)?
在将数据插入数据库之前验证数据。如果字符串太大而无法放入您的表中,则可能是您的列太窄,或者数据无效。您需要决定是在存储之前截断它,还是做一些错误报告,或者两者兼而有之。
不要关闭 DBMS 的安全功能,这是完全错误的做法。
您宁愿默默地截断您的数据(可能导致数据损坏)还是至少想知道您有问题?
我建议启用严格模式并在 PHP 中检查您的数据。您的 PHP 应用程序知道或至少应该知道如何处理太长的字符串。如果您关闭严格模式并将该决定留给 MySQL,那么 MySQL 将默默地截断您的字符串,您最终将得到一个充满垃圾的数据库。
更改和修复代码很容易,修复损坏的数据通常是不可能的。
如果禁用严格模式,最终会遇到如下奇怪的问题:
好吧,这取决于你在禁用严格模式的情况下尝试它,看看事情是如何工作的,我从来没有遇到过禁用它的问题,但要小心。
但是,如果长用户代理是严格模式的唯一问题,并且您没有直观地阅读它们,那么我建议您只散列您的 UA 或增加字段长度。
如果您需要这样做,查询失败,并且您没有知识或预算来修复它 - 那么是的。
如果有人问这是如何正确禁用严格模式,只需在 MySQL 配置中添加:
sql_mode=NO_ENGINE_SUBSTITUTION
innodb_strict_mode=0