6

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

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

4

4 回答 4

9

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

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

于 2011-04-03T08:28:48.743 回答
3

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

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

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

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

VARCHAR(4) 存储的字符多于四个

于 2011-04-03T08:30:08.667 回答
1

好吧,这取决于你在禁用严格模式的情况下尝试它,看看事情是如何工作的,我从来没有遇到过禁用它的问题,但要小心。

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

于 2011-04-03T08:29:37.653 回答
1

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

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

sql_mode=NO_ENGINE_SUBSTITUTION
innodb_strict_mode=0
于 2019-03-15T23:05:55.130 回答