2014-01-15 30 views
1

下面的語句返回「錯誤代碼:1292截斷不正確INTEGER值:'95 .00' 1.132秒」MySQL錯誤1292時更新語句中使用投

update new2006 set new2006.emp=cast(emp as unsigned) where IsNum(emp)=0; 

但是,如果使用下面的語句,我可以成功獲得結果95。

select cast(emp as unsigned) from new2006 where IsNum(emp)=0; 

任何人都可以幫助我嗎?先謝謝了。

PS:emp的數據類型是varchar(7)。

+0

節目表結構,請 – nrathaus

+0

EMP的數據類型爲varchar(7) – Chine

回答

1

你是在一個嚴格的SQL mode;如記錄(強調):

嚴格模式控制的MySQL如何在數據變化語句如INSERTUPDATE處理無效或缺失值。由於多種原因,值可能無效。例如,它可能具有該列的錯誤數據類型,或者它可能超出範圍。當要插入的新行不包含非定義中的DEFAULT子句的非NULL列時,值將丟失。 (對於NULL柱,NULL如果值是缺少被插入。)

對於語句不改變數據,如SELECT,無效值產生在嚴格模式的警告,而不是錯誤。

如果你想UPDATE沒有錯誤取得成功,你將需要改變,以非嚴格的SQL模式,否則第一操縱串入的值不會引發錯誤,例如SUBSTRING_INDEX(emp, '.', 1)

+0

@Downvoter:護理評論? – eggyal

-1

這很容易複製,如:

CREATE TABLE new2006 (
emp VARCHAR(7) 
); 
INSERT INTO new2006 (emp) VALUES ('95.00'); 
UPDATE new2006 SET emp=CAST(emp AS UNSIGNED); 

我懷疑,因爲沒有錯誤消息,當您轉換爲十進制問題與內部轉換自/至基地2:

UPDATE new2006 SET emp=CAST(emp AS DECIMAL); 

...或者當您從源數據中刪除小數點時:

INSERT INTO new2006 (emp) VALUES ('95'); 

我找不到這在揭示這個問題的manual page for CAST()。我的猜測是,MySQL根據輸入場景選擇不同的算法或內部變量類型,有時會在執行內部計算時發生截斷。

1

試試這個

update IGNORE new2006 set new2006.emp=cast(emp as unsigned) where IsNum(emp)=0;