2010-11-27 19 views
1

私は、 "オフセット"という名前のENUMフィールドと他のいくつかの列を持つMYSQLテーブルを持っています。フィールドは以下のように定義される:ENUM( "0"、 "1")がMysqlに空の文字列として保存されるのはなぜですか?

ENUM(0,1)、今は2つのサーバーを持っているNULL、所定値NULL

することができます。プロダクションサーバーと開発サーバー、およびデータベースの作成と更新に使用された同じPHPスクリプト。

まずステップ:アプリケーションがCREATEクエリで "オフセット" を渡しwitoutレコードを作成します。

第2ステップ:アプリケーションはユーザーに何らかのデータ(オフセット値ではない)を要求し、ステップ1で挿入された行を読み取り、配列を作成し、一部のフィールドを更新します(オフセットフィールドではありません)。自動化された方法でクエリを作成し、更新された値で行を再度保存します。

自動クエリービルダーは、配列に渡されたすべてのフィールドを読み取り、UPDATE文字列を作成します。私はこの配列を取得し、両方のシステムで

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

とmysql_real_escape_stringの中で値を渡すこの同じクエリに変換します

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

は今問題があります。運用システムでクエリを起動すると、行が保存されます。開発システムにエラーがあり、dbには行を保存せずにオフセットデータが間違っていると表示されます。

phpmyadminから、最初の手順で行を作成すると、オフセットフィールドにNULLが表示されます。エラーを出さないシステムにフィールドを保存すると、空の文字列が表示されます。

どちらのシステムもMySQL 5を使用していますが、Linuxでは5.0.51、Windowsでは5.0.37を使用しています。

質問:

一つのシステムは私にエラーANフィールドを保存し、他のものを与えるのはなぜ?構成の違いはありますか?

列挙型 "0"または "1"のフィールドを保存すると、なぜNULLが保存されるのでしょうか?

答えて

2

1つのシステムでエラーが表示されるのはなぜですか?構成の違いはありますか?

おそらく。下記参照。

列挙型 "0"または "1"のフィールドを保存すると、なぜNULLが保存されるのでしょうか?MySQL ENUM documentationによると

値は、特定の状況下では、空の文字列( '')またはNULLになることがあります。

  • あなたに無効な値を挿入した場合ENUM(つまり、許可された値のリストにない文字列)の場合は、空の文字列が特別なエラー値として挿入されます。 ...

    厳密なSQLモードが有効な場合、無効なENUM値を挿入しようとするとエラーになります。この文字列は、通常の空文字列と区別できます。

(強調は追加。)

0

あなたはそれがNULLになりたい場合は、最初の場所でこれをしない理由:

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

stragerの答えは次のように思えますあなたのコードが2つの環境で異なって動作する理由についての良い説明。

問題は他のところにあります。クエリでNULLに値を設定したい場合、あなたは正確にNULLを使用shoundが、あなたは結果は常に文字列である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 

一部のDBレイヤーは、これをうまく処理します。

+0

+1これは正確に私が "環境"の違いを解決し、間違って生成されたクエリを回避した後に尋ねるヌル値をエスケープするという副問題の答えです – yuri

関連する問題