2009-11-06 552 views
29

我有一個「bill_date」字段,我希望它是空白的(NULL),直到它被記帳爲止,此時將輸入日期。如何在MySQL中的datetime字段中存儲空值?

我看到MySQL不喜歡datetime字段中的NULL值。你們有沒有一種簡單的方法來處理這個問題,還是我不得不使用最短日期作爲「NULL等值」,然後檢查那個日期?

謝謝。

編輯補充:

好吧我看到MySQL將接受NULL值,但如果我在使用PHP更新記錄,它不會接受它作爲一個數據庫更新。

變量名是$bill_date但它不會離開變量爲NULL,如果我不發送值$bill_date更新記錄 - 我得到這個錯誤:

Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1 

我想我需要真正的發送NULL一詞,或者將它全部保留在更新查詢中,以避免此錯誤?我對嗎?謝謝!!!

+0

MySQL是否接受日期時間定義的空值,但如果由於某種原因認爲否則不會使用空值,可以考慮簡單地使用'1000-01-01'作爲值並排除行在您的查詢中爲您的bill_date列提供該值。 – BraedenP

+0

Mysql在datetime字段中允許空值。我懷疑問題來自您訪問mysql的方式。你能用你用來訪問數據的機制來編輯你的問題嗎?例如,你使用我的ODBC,使用Perl庫等? – anschauung

+0

使用PHP - 查看我上面的編輯。 – rhodesjason

回答

42

MySQL 確實允許NULL值爲datetime字段。我只是測試它:

mysql> create table datetimetest (testcolumn datetime null default null); 
Query OK, 0 rows affected (0.10 sec) 

mysql> insert into datetimetest (testcolumn) values (null); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from datetimetest; 
+------------+ 
| testcolumn | 
+------------+ 
| NULL  | 
+------------+ 
1 row in set (0.00 sec) 

我使用這個版本:

mysql> select version(); 
+-----------+ 
| version() | 
+-----------+ 
| 5.0.45 | 
+-----------+ 
1 row in set (0.03 sec) 

編輯#1:我在你的編輯看到在PHP所得到的錯誤信息表明,要傳遞的空串(即''),而不是null。空字符串與null不同,並且不是有效的datetime值,這就是您收到該錯誤消息的原因。如果這就是你的意思,你必須通過特殊的sql關鍵字null。另外,請勿在單詞null附近引用任何引號。有關如何插入null的示例,請參閱上面的insert聲明。

編輯#2:你在使用PDO嗎?如果是這樣,當綁定空參數時,請確保在綁定null時使用[PDO::PARAM_NULL][1]類型。請參閱answer to this stackoverflow question關於如何使用PDO正確插入null

+0

使用PHP - 在上面的原始文章中查看我的編輯。 – rhodesjason

+0

@Jason Rhodes:好的,我已經更新了我的答案以解決您的編輯問題。如果仍然無法正常工作,請發佈您的PHP代碼。 – Asaph

+0

@Jason Rhodes:如果您使用的是PDO,我已經提供了一些可能有用的提示。 – Asaph

2

我剛剛在MySQL v5.0.6中測試,並且datetime列接受null沒有問題。

3

這取決於你如何聲明你的表格。 NULL不會在被允許:

create table MyTable (col1 datetime NOT NULL); 

但它會在被允許:

create table MyTable (col1 datetime NULL); 

第二個是默認的,所以有人一定是積極決定,列不應該爲空。

18

這是一個明智的觀點。

空日期不是零日期。他們可能看起來一樣,但他們不是。在mysql中,空日期值爲空。零日期值是一個空字符串('')'0000-00-00 00:00:00'

無效日期「...其中mydate =''」將失敗。
在空/零日期「...其中mydate爲空」將失敗。

但現在讓我們變得時髦。在mysql日期中,空/零日期是嚴格相同的。

通過示例

 
select if(myDate is null, 'null', myDate) as mydate from myTable where myDate = ''; 
select if(myDate is null, 'null', myDate) as mydate from myTable where myDate = '0000-00-00 00:00:00' 

都將輸出: '0000-00-00 00:00:00'。如果使用''或'0000-00-00 00:00:00'更新myDate,那麼兩個選擇仍然會一樣。

在php中,mysql空日期類型將被標準的mysql連接器所尊重,並且是真正的空值($ var === null,is_null($ var))。空日期將始終表示爲'0000-00-00 00:00:00'。

我強烈建議只使用空日期,如果可以的話只使用空日期。 (一些系統將使用「virual」零日期,這是有效的公曆日期,例如1970-01-01(linux)或0001-01-01(oracle)。

空的日期在php/mysql中更容易。 '沒有'where field is null'來處理,但是你必須在''中手動轉換'0000-00-00 00:00:00'的日期以顯示空白字段(存儲或搜索你沒有特殊的情況下處理零日期,這是很好的)。

空日期需要更好的照顧,你必須小心,當你插入或更新不添加引號周圍null,否則零日期將是插入而不是null,這會導致您的標準數據混亂。在搜索表單中,您將需要處理諸如「and mydate is not null」之類的情況,依此類推。

空日期通常是更多的工作。但它們比查詢的零日期快得多。

1

具體涉及你得到,你不能做這樣的事情在PHP可空場在MySQL錯誤:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . null . ')'; 

因爲空在PHP將等同於一個空字符串,它是不是與MysQL中的NULL值相同。相反,你要做到這一點:

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (is_null($col2) ? 'NULL' : $col2). ')'; 

當然,你不必使用is_null,但我想,它說明了這一點更好一點。使用empty()或類似的東西可能更安全。如果$ col2碰巧是一個字符串,你可以用查詢中的雙引號括起來,不要忘記而不是,以包含那些'NULL'字符串,否則它不會工作。

希望有幫助!

+0

在第一個示例中,您可以簡單地執行: '$ sql ='INSERT INTO table(col1,col2)VALUES('。$ col1。',null)'; – Pere

2

它的價值:我遇到了一個類似的問題,試圖通過Perl更新MySQL表。當空字符串值(從來自另一個平臺讀取的空值轉換)傳遞到日期列(下面代碼示例中的'dtcol')時,更新將失敗。我終於成功地讓使用嵌入在我的更新語句IF語句更新的數據:

... 
    my $stmnt='update tbl set colA=?,dtcol=if(?="",null,?) where colC=?'; 
    my $status=$dbh->do($stmt,undef,$iref[1],$iref[2],$iref[2],$ref[0]); 
    ... 
3

我對窗口這個問題。

這是解決方案:

要通過「」爲NULL,你應該禁用STRICT_MODE(這是默認啓用的Windows安裝)

BTW這很有趣,通過「」爲NULL。我不知道他們爲什麼會讓這種行爲。

0

我剛剛發現,如果該字段的默認值爲null,並且我編寫了特定的if語句並省略引號,則MySQL將採用null。這也適用於更新。

if(empty($odate) AND empty($ddate)) 
{ 
    $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' "; 
}; 
相關問題