【发布时间】:2018-01-21 01:29:05
【问题描述】:
(更新,因为这个问题被标记为重复)
我不是询问错误 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。但是如果 曾经被最大化,我也永远不会知道并丢失数据。)
【问题讨论】:
-
您可以在 MySQL 中开启严格模式。见dev.mysql.com/doc/refman/5.7/en/…
-
那么,将这个问题命名为“如何在 Laravel 中启用严格模式”。将其标记为重复的人并没有完全阅读它。三个“已回答”的事情中的两个只告诉我我在问题中已经给出的内容(这被截断了),最后一个没有回答如何在 Laravel 中实现严格模式。
-
既然我自己都无法回答,现在:MySQL 部分在
config/database.php中有一个“严格”标志,设置为true- 这显然不是默认值,一个获得PDOException而不是静默数据丢失。 -
如果有人有一个在 2016 年 5 月之前开始的 laravel 项目,那么你很有可能遇到同样的情况。严格模式已在 2016-05-10 默认引入(参见:github.com/laravel/laravel/commit/…)
标签: php mysql database laravel laravel-5.4