2010-10-29 37 views
3

我有一個查詢是動態編寫的(OO PHP通過Joomla)將一些值插入MySQL數據庫。用戶填寫的表單上有一個字段,如果他們留下空白,我希望進入系統的值爲NULL。我已經將錯誤日誌中的查詢寫出來,這是查詢的樣子:在MySQL中導致0.00的查詢值爲NULL

INSERT INTO arrc_Voucher 
    (VoucherNbr,securityCode,sequentialNumber, TypeFlag, CreateDT, ActivatedDT, BalanceInit, BalanceCurrent, clientName)  
VALUES 
    ('0199108006', '99108006','12','V','2010-10-29 12:50:01','NULL','NULL','NULL','') 

當我看到在數據庫表,不過,雖然ActivatedDT正確設置爲NULL,BalanceInit和BalanceCurrent均爲0.00。 ActivatedDT字段是日期時間,而另外兩個是十進制(18,2),並且所有三個都在表結構中設置爲默認值NULL。

如果我運行這樣的查詢:

UPDATE arrc_Voucher 
    SET BalanceInit = null 
WHERE BalanceInit like "0%" 

...它設置爲null值,那麼爲什麼不在初始插件查詢這樣做?是因爲null是用引號引起來的嗎?如果是這樣,爲什麼它爲ActivatedDT正確設置?

回答

6

刪除NULL左右的引號。實際發生的情況是試圖將字符串'NULL'作爲數字插入,並且由於它不能轉換爲數字,所以它使用默認值0

至於爲什麼ActivatedDT的作品,我猜這是一個日期字段。如果未能將字符串轉換爲日期,通常會導致將值設置爲0(其格式類似於'1969-12-31'),但如果您啓用了NO_ZERO_DATE模式,則它將被設置爲NULL

如果您想的MySQL拋出一個錯誤在這樣的情況下,當無效值傳遞,您可以設置STRICT_ALL_TABLESSTRICT_TRANS_TABLES(確保你瞭解它們之間的區別的部分)或仿真模式之一,如TRADITIONAL

您可以使用命令SET sql_mode='TRADITIONAL'或在my.cnf中添加sql-mode="TRADITIONAL"來嘗試此操作。

+0

謝謝!我想這是報價,但不明白爲什麼它與日期字段,而不是其他人。 – EmmyS 2010-10-29 19:11:15

+0

在一個理智的數據庫中,你會得到一個類似「無法將字符串插入整數字段」的錯誤,但MySQL試圖猜測你可能意味着什麼,而不是給出錯誤。 – rjmunro 2012-12-11 15:50:07

+0

@rjmunro MySQL也支持嚴格模式,我已將這些信息添加到我的答案中。 – 2012-12-12 17:56:09

2

您並未將字段設置爲NULL,而是設置爲字符串('NULL')。

3

將NULL插入到MySQL數據庫中時,不能在其周圍插入引號。它試圖插入varchar'NULL'。如果你的想法起作用了,你將永遠無法將實際的單詞NULL插入到數據庫中。

當您要插入NULL時刪除單引號。