2010-11-27 227 views
1

我有一個名爲「偏移量」和其他一些列的ENUM字段的MYSQL表。該字段被定義爲:爲什麼ENUM(「0」,「1」)在Mysql中保存爲空字符串?

ENUM(0,1),可NULL,預定值NULL

現在我有兩個服務器。生產服務器和開發服務器以及用於創建和更新數據庫的相同PHP腳本。

第一步:應用程序創建的記錄不用其他經過在創建查詢「偏移」。

第二步:應用程序要求用戶的某些數據(不是「偏移」的值),讀取插入在第一步中的行和製造陣列,更新一些字段(不是「偏移」字段中),以自動方式創建查詢並使用更新後的值再次保存該行。

自動查詢生成器簡單讀取數組中傳遞的所有字段並創建UPDATE字符串。

在兩個系統中我得到這個數組:

$values = array(... 'offset' => null); 

,並將其轉換中傳遞值的mysql_real_escape_string此相同的查詢:

UPDATE MyTable SET values..., `offset` = '' WHERE id = '10'; 

現在有這個問題。當我在生產系統中啓動查詢時,該行被保存,在開發系統中,我得到一個錯誤,並且數據庫表示在不保存行的情況下,偏移數據是錯誤的。

從phpmyadmin當我創建第一步的行時,它在偏移量字段中顯示NULL。在系統中保存沒有錯誤的字段後,它會顯示一個空字符串。

兩個系統都使用MySQL 5,但生產在Linux上使用5.0.51,在Windows上使用5.0.37。

的問題:

爲什麼一個系統給我一個錯誤的另一種救場?配置有差別嗎?

爲什麼當我保存爲枚舉「0」或「1」的字段時,它會保存「」而不是NULL?

回答

2

爲什麼一個系統給我一個錯誤,另一個保存該字段?配置有差別嗎?

也許。見下文。

爲什麼當我保存字段是一個枚舉「0」或「1」它保存「」而不是NULL?

按照MySQL ENUM documentation

值也可能是空在某些情況下字符串( '')或NULL:

  • 如果插入無效值成ENUM(即,不存在於允許值列表中的字符串),將插入空字符串作爲特殊錯誤值。該字符串可以通過該字符串的數值爲0的事實與「正常」空字符串區分開來。...

    如果啓用嚴格的SQL模式,則嘗試插入無效的ENUM值會導致錯誤。

(着重號。)

0

如果你希望它是NULL,你爲什麼不擺在首位做到這一點:

UPDATE MyTable SET values..., `offset` = NULL WHERE id = 10; 
2

strager的答案似乎是一個很好的解釋爲什麼你的代碼在2個環境中的行爲不同。

但問題在於別處。如果你想設置一個值設置爲NULL在您shound使用完全相同NULL的查詢,但您使用mysql_real_escape_string()的結果始終是一個字符串:

$ php -r 'var_dump(mysql_real_escape_string(null));' 
string(0) "" 

您應該區別處理這個問題。例如:

$value = null 
$escaped_value = is_null($value) ? "NULL" : mysql_real_escape_string($value); 
var_dump($escaped_value); 
// NULL 

某些數據庫層(如PDO)可以爲您處理這個問題。

+0

+1因爲這正好是關於轉義空值的問題的答案,我會問解決「環境」的差異後,完全避免錯誤生成的查詢 – yuri 2010-11-28 09:01:26

相關問題