(由于此问题被标记为重复,因此更新)
我不询问错误1406本身。我知道这意味着什么。事实上,如果你阅读以下内容,你会发现我特意想要这样的错误。我也没有直接询问MySQL中的严格模式。我知道它存在并且它是活动的(正如mysql
CLI中的以下示例所证明的那样)。第三个"重复"有点用,但也没有真正回答这个问题。它只提到了安全方面的严格模式。在使我走上正轨的过程中,有点有用,但它根本不是重复的。
请重新开启此问题。 (/更新)
我有一个非常简单模型的项目。它只有几个字段,其中一个是注释,存储为varchar(255)
。
如果我通过mysql
命令行工具存储超过255个字符,我就会得到
ERROR 1406 (22001): Data too long for column 'comment' at row 1
MariaDB [testing]> show warnings;
+-------+------+---------------------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------------------+
| Error | 1406 | Data too long for column 'comment' at row 1 |
+-------+------+---------------------------------------------+
这很好。我想在Laravel中出现这个错误!但是当我通过我的Laravel模型做同样的事情时,它会很高兴地告诉我它会被存储。基本上,我可以这样做:
$longPayload = str_repeat("a", 1000);
$suspiciousEntry = MyModel::fromInput(array('comment' => $longPayload));
$suspiciousEntry->save(); // this will return true!
但即使已返回true
,仍未在数据库中存储1000个字符。当然只有前255个字符才会结束。
我的问题是:我如何在运行时了解此?我本来希望在某处看到mysql-error 1406或异常。但是在某些时候,laravel必须选择截断数据(或者mysql会拒绝它)。
在这种情况下,我希望能够向用户发出某种警告,例如HTTP 422 Unprocessable Entity
。现在,存在数据丢失的风险,我很不舒服。
(注意:这不是关于如何使该字段更大的问题。我已经将其转换为MEDIUMTEXT
。但是如果 已经被最大化,我会也永远不会知道和丢失数据。)
答案 0 :(得分:0)
我已经找到了答案:MySQL / MariaDB在更新的版本中知道严格的模式。命令行界面似乎正在使用它。
Laravel在Laravel 5周围引入了一个设置,但最初默认为false
。如果您在Laravel 5.3(Commit from May 2016)之前创建了项目,则您的config/database.php
可能会将此设置设置为false
。
只要设置为false
,您就可能在任何时候丢失数据,而且永远不会知道它。
如果您将其设置为true
,您现在会收到\PDOException
- 这可以根据您的需要进行处理。如果您不处理它,您可能会收到HTTP 500
错误 - 在我的书中仍然比静默数据丢失更好。
简而言之:将config/database.php
设置为使用'strict' => true
为您的mysql适配器,如果您还没有这样做。