2009-11-09 35 views
22

我正在構建一個PHP/MySQL應用程序,並且遇到了我的創建和更新查詢的問題。我有5列設置爲鍵入FLOAT也設置爲NULL列,我不打算在工作流程的後期填寫它們。這是什麼錯誤? 「數據庫查詢失敗:第1行的列'column_name'的數據被截斷

但是,我需要爲此數據庫創建新記錄,並且需要編輯現有記錄,而無需我使用OOP PHP,它使用標準的save()方法來檢查對象中是否存在ID,如果不存在,則調用create(),如果是,則調用update()。好吧,通常。

update()create()方法設計用於從每個Class頂部聲明的protected static $db_fields屬性數組中提取屬性數組,該數組包含該表中使用的所有字段。相應地,update()create()在SQL中通過該陣列並且INSERT INTOUPDATE

我的理解是,如果您使用''(兩個單引號,空),SQL將跳過那些INSERT INTOUPDATE請求,並將它們保留爲NULL。對於頁面上任何位置的5個浮動值,甚至沒有表單字段,所以當方法運行時,值將爲''

這就是爲什麼我得到「數據截斷」錯誤?這看起來不同 - 我之前沒有看到截斷的錯誤,這就是爲什麼我要來找你的天才。謝謝。

+0

我的預感是,MySQL期望寫入FLOAT字段的值至少爲數字或NULL。你嘗試過使用NULL而不是''嗎? – jkndrkn 2009-11-09 22:25:52

回答

29

''null是不一樣的。如果你的mysql服務器處於嚴格模式,那麼它會拒絕執行插入操作,因爲你已經傳遞了列的無效數據。沒有嚴格的模式,它會返回一個警告。

mysql> create table a (a float not null); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert a values (''); 
Query OK, 1 row affected, 1 warning (0.05 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1265 | Data truncated for column 'a' at row 1 | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> set sql_mode = 'STRICT_ALL_TABLES'; 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert a values (''); 
ERROR 1265 (01000): Data truncated for column 'a' at row 1 

要麼插入明確null S,或者甚至不指定插入列。

當你更新你可以發送你所有的值,因爲mysql會自動忽略不變的值。

+0

是的,我可以看到我需要這樣做。但是對於UPDATE,它並不是真的,因爲你經常擁有一個擁有所有記錄列的表單,但你只更新一個或兩個表單,而應用程序不知道哪些表單被更改了,因此它會更新它們,等等 我感興趣的是 - TRUNCATED錯誤來自哪裏? – rhodesjason 2009-11-09 22:42:23

+0

看我更新的例子。截斷錯誤是mysql告訴你,它不能將你傳遞給它的零長度字符串轉換爲適當的數值。 – longneck 2009-11-10 15:07:46

+0

好吧,這是我需要聽到的 - 這只是插入過程中的一個問題,而不是在更新過程中。我開始擔心了!謝謝。 – rhodesjason 2009-11-10 16:22:03

1

如果你不打算INSERT數據,它不應該在SQL語句中。例如,假設您有一個帶有id,float1,float2,float3和float4,Float5的表格「Data」,其中您將只添加該ID。在INSERT應該是這樣的:

INSERT INTO `Data` (`id`) 
VALUES ('Some-ID-Value') 

如果彩車被定義爲接受NULL,他們將被默認爲NULL。對於UPDATE語句也是如此,你應該只列出你將要改變的字段。

1

這並不意味着解決方案,而只是爲了解決這個問題。

如果將關鍵字IGNORE添加到語句中,並嘗試將「'(或任何不以數字開頭的字符串)插入到浮點列中,MySQL將插入值0而不是默認值。

INSERT IGNORE INTO a_table (float_column) VALUE ('') 

INSERT IGNORE INTO a_table (float_column) VALUE ('abc') 

兩者都會插入0,即使默認值爲null。當然,如果沒有IGNORE,這兩種表述都會引發你所看到的錯誤。

總之,您收到消息是因爲您提供的數據既不是預期類型也不是默認值。

相關問題