2017-08-12 69 views
0

(此問題的更新已被標記爲重複) 我是而不是詢問錯誤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但如果曾經被刷爆了,我也從來不知道,失去的數據)

+0

您可以在MySQL中打開嚴格模式。請參閱https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_all_tables – ceejayoz

+0

然後,將此問題命名爲「如何在Laravel中啓用嚴格模式」。如果將此標記爲重複,則不會完全讀取它。三個「回答」中的兩個只告訴我我在問題中已經給出了什麼(這被截斷),最後一個沒有回答如何在Laravel中實現嚴格模式。 – amenthes

+0

因爲我現在甚至都不能回答它:現在:MySQL部分在config/database.php中有一個「strict」標誌,這個標誌設置爲「true」 - 顯然這不是默認標誌, PDOException'而不是無聲的數據丟失。 – amenthes

回答

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適配器,如果你還沒有這樣做。