2011-04-03 31 views
4

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

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

+1

你可以将其插入之前检查字符串的应用水平长度。 – 2011-04-03 08:29:23

+0

@Pekka:你会如何合理地做到这一点?我不想在软件的任何地方调用方法。 – Tower 2011-04-03 08:31:08

+0

好吧,你大概不得不在任何地方逃避传入的数据。一个'substr()'可以工作,不会增加太多混乱。如果你的应用程序使用严格模式,否则(这很好),我会走这条路,并保持原样 – 2011-04-03 08:33:55

回答

9

在将数据插入数据库之前验证数据。如果字符串太大而不适合您的表格,那么您的列太窄或数据无效。您需要决定是否在存储它之前截断它,执行一些错误报告,或者两者兼而有之。

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

+2

我希望你可以把更大胆的“不”。如果你能把MySQL的严格性转化为11,那将是很好的。 – 2011-04-03 08:31:38

+1

我并没有觉得服务器模式是一种安全功能。虽然我猜这取决于你对安全功能的定义 – ChrisWue 2011-04-03 08:33:32

+1

@ChrisWue:我会打电话给“没有默默地修改你的数据”的安全功能。 – 2011-04-03 08:41:46

1

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

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

2

你宁愿让你的数据被自动截断(可能导致破损的数据),或者你至少想知道你有问题吗?

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

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

如果禁用了严格模式,你会喜欢这个奇怪的问题结束了:

VARCHAR(4) storing more characters than four