(此問題的更新已被標記爲重複) 我是而不是詢問錯誤1406本身。我知道這意味着什麼。事實上,如果你閱讀以下內容,你會看到我特意想要這樣的錯誤。我也沒有直接詢問MySQL中的嚴格模式。我知道它存在並且它處於活動狀態(如以下示例所示,從mysql
CLI)。第三個「重複」是有用的,但也沒有真正回答這個問題。它只提到安全方面的嚴格模式。這是有點有用,使我在正確的軌道上,但它根本不是重複。檢測屬性是否被laravel或數據庫截斷?
請重新打開此問題。 (/更新)
我有一個非常簡單的模型項目。它只有幾個字段,其中一個是註釋,存儲爲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錯誤1406或某處的異常。但是在某些時候,laravel必須選擇截斷數據(否則mysql會拒絕它)。
在這種情況下,我寧願能夠向用戶拋出某種警告,如HTTP 422 Unprocessable Entity
。目前,存在數據丟失的風險,我感到不舒服。
(注意:這不是關於如何使外地大的問題,因爲我已經把它轉換成一個MEDIUMTEXT
但如果是曾經被刷爆了,我也從來不知道,失去的數據)
您可以在MySQL中打開嚴格模式。請參閱https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_all_tables – ceejayoz
然後,將此問題命名爲「如何在Laravel中啓用嚴格模式」。如果將此標記爲重複,則不會完全讀取它。三個「回答」中的兩個只告訴我我在問題中已經給出了什麼(這被截斷),最後一個沒有回答如何在Laravel中實現嚴格模式。 – amenthes
因爲我現在甚至都不能回答它:現在:MySQL部分在config/database.php中有一個「strict」標誌,這個標誌設置爲「true」 - 顯然這不是默認標誌, PDOException'而不是無聲的數據丟失。 – amenthes