Mysql

CONCAT_WS 導致部分工作的“數據太長”?

  • April 4, 2019

我有一個包含幾列的簡單表格,我正在嘗試將其中的兩個合併為一個。我正在使用 MySQL 5.5,我可以通過 MySQL Workbench 執行以下(匿名)查詢來重現特定數據集的錯誤:

UPDATE person SET a = CONCAT_WS('\n', a, b)

它清楚地產生以下響應消息:

Error Code: 1406. Data too long for column 'a' at row 34

因為兩者ab都是VARCHAR(200)響應是公平的,但我希望並希望由於它產生了錯誤,因此不會送出任何更改。然而,顯然確實如此。我無法在較小的虛擬數據集上重現它。我正在使用自動送出。

我的假設是錯誤的查詢不會改變任何值嗎?它可能是我的 MySQL 伺服器的自動送出或其他設置的一些功能嗎?

請詢問我的規範中是否缺少任何明顯的細節。

我希望並希望由於它產生錯誤,因此不會送出任何更改

原因在於嚴格的 SQL 模式

當發生錯誤(而不是警告)時,僅忽略其餘行,已更新的行不會回滾。

請參閱嚴格的 SQL 模式

對於 STRICT_ALL_TABLES,MySQL 返回錯誤並忽略其餘行。但是,由於較早的行已被插入或更新,結果是部分更新。為避免這種情況,請使用單行語句,該語句可以在不更改表的情況下中止。


“單行語句”是什麼意思?

這是一個嚴格影響一行的語句。通過 WHERE 條件和/或通過 LIMIT 邊界。如果發生警告轉換為錯誤,則更新中的行不會更改。


兩者都是a_b``VARCHAR(200)

這意味著連接的值最多可以是 402 個符號。所以使用

UPDATE person 
SET a = LEFT(CONCAT_WS('\n', a, b), 200); -- truncate if too long

或者

UPDATE person 
SET a = CONCAT_WS('\n', a, b) 
WHERE LENGTH(CONCAT_WS('\n', a, b)) <= 200; -- do not update if too long

引用自:https://dba.stackexchange.com/questions/233938