【问题标题】:detect if a property has been truncated by laravel or the database?检测属性是否被 laravel 或数据库截断?
【发布时间】: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


【解决方案1】:

我已经找到了答案: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 适配器,如果您还没有这样做的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2011-03-05
    • 2015-02-16
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多