6

はい、別の NULL と空の文字列の質問です。

NULL は設定されていないことを意味し、空の文字列は「空の値」を意味するという考えに同意します。ここに私の問題があります。列のデフォルト値が NULL の場合、ユーザーがその NULL を入力できるようにするにはどうすればよいですか。

システムで新しいユーザーが作成されたとします。姓と名のフィールドがあります。姓は必須ですが、名は必須ではありません。ユーザーを作成すると、最初と最後に 1 つずつ、2 つのテキスト入力が表示されます。その人は姓のみを入力することを選択します。名は技術的に設定されていません。挿入中に、各フィールドの長さをチェックし、空のすべてのフィールドを NULL に設定します。

データベースを見ると、名が設定されていないことがわかります。すぐに頭に浮かぶ疑問は、名前フィールドを見たことがない (つまり、エラーのため) ということです。しかし、そうではありません。空白の場合、彼らは去りました。

それで、私の質問は、ユーザー入力を受け取ったときに、フィールドを NULL または空の文字列に設定する必要があるタイミングをどのように決定するのですか? ユーザーがフォーカスを検出せずにフィールドを設定しないことを望んでいること、または値を削除したことをどのように知ることができますか...または...または...?

関連する質問:テーブルの列にデータがないことを表すには、NULL または空の文字列を使用する必要がありますか?

4

8 に答える 8

9

パターンを破って、次の理由から、長さ 0 の文字列には常に NULL を使用すると言います。

  1. 空白の影響を細かくスライスする場合は、他のすべての開発者が同じ方法で読み書きできるようにする必要があります。

  2. どのようにアルファベットにしますか?

  3. 意図的に空白のままにした場合と比較して、ユーザーが値の入力を省略した場合を明確に判断できますか?

  4. 違いを明確に照会するにはどうすればよいでしょうか? クエリ画面のユーザーは、標準の入力フォーム構文を使用して NULL と空白を示すことができますか?

  5. 実際には、このルールを使用したデフォルトの驚くべき動作を使用して、データの読み取りと書き込みを禁止されたことはありません。違いを知る必要がある場合は、boolean フィールドを使用しました (明確な UI デバイスにマップする方が簡単です)。あるケースでは、トリガーを使用して True => null 値を適用しましたが、BR レイヤーが条件を効果的に除外したため、トリガーが呼び出されることはありませんでした。

于 2009-01-02T03:24:04.923 に答える
8

ユーザーが空の文字列を提供した場合、データベースの観点からは常に null として扱います。さらに、通常、文字列入力をトリミングして先頭/末尾のスペースを削除し、空であることを確認します。これは、varchar() 型を使用したデータベースでの小さな勝利であり、name is nullnullname is null or name = '' を ''. いずれにせよ、方法を選択し、一貫性を保ちます。

于 2009-01-02T02:48:50.643 に答える
6

あなたがする必要があるのは、あなたが望む行動を理解することです。名前文字列がどのように解釈されるかについて、決まった代数はありません。

ここでステート マシンについて考えてみましょう。いくつかの状態を持つフィールドがあります。「初期化された」状態、「意図的に空」の状態、および設定値を持つ 3 番目の状態について考えているように聞こえます。その割り当てを行い、プログラムの残りの部分と一貫性があることはすべて見つかります。簡単なマッピングは

NULL → 初期化されていない
"" → 意図的
に名前を設定解除 → 初期化されています。

于 2009-01-02T02:47:43.423 に答える
2

実際のデータを参照するときに NULL を使用することはほとんどありません。外部キーに使用する場合、NULL は有効ですが、ユーザーが入力したデータに対してはほとんど有効ではありません。1 つの例外は、"termination_date" フィールドを持つ従業員データベースなど、存在しない日付の場合です。その場合、現在のすべての従業員は、そのフィールドに NULL の値を持つ必要があります。ユーザーに実際に null 値を入力させることに関しては、実際に null 値が必要な値については、入力フィールドの横にチェックボックスを配置して、ユーザーがオンとオフを切り替えて null に対応する値を確認できるようにします (またはよりユーザーフレンドリーな方法で、なし)。チェックボックスを有効にしてフィールドを null に設定する場合、対応するテキスト ボックスを無効にする必要があります。null 値が既に関連付けられている場合は、

于 2009-01-02T02:49:36.320 に答える
1

私は物事をシンプルに保つようにしています。この場合、名の列を null 非許容にし、空白を許可します。それ以外の場合は、このフィールドを参照する場所で 3 つのケースに対処する必要があります。

  1. 空白の名
  2. 名が空です
  3. 空白でない名

'blank is null' または 'null is blank' を使用する場合は、2 つのケースに分かれます。2 つの場合は 3 つよりも優れています。

あなたの質問にさらに答えるには、データを入力するユーザーは、「null」とは何か、「空」とどのように比較するかについて、おそらく何も知らない (そして知っているべきではありません)。この問題は、UI ではなく、システムで完全かつ一貫して解決する必要があります。

于 2009-01-02T02:44:07.190 に答える
1

あなたの例は主に文字列用ですが、数値フィールドとブールフィールドには null を使用すると言いたいです。accountbalance が 0 であることは、null であることとは大きく異なります。ブール値についても同様です。人々が真と偽の答えを持つ多肢選択式テストを受ける場合、誰かが真または偽と答えたか、またはまったく答えなかったのかを知ることは非常に重要です。このような場合に null を使用しないと、誰かが質問に回答したかどうかを確認するために、追加のテーブルまたは別のセットアップが必要になります。たとえば、false の場合は 0、true の場合は 1 を入力しない場合は -1 を使用できますが、本質的にブール値である数値フィールドを使用しています。

于 2012-08-08T10:39:29.410 に答える
0

実稼働コードで NULL 値を使用したことは一度もありません。空の文字列は、空白の名前フィールド、電話番号、または任意のアプリケーションの年収の優れたセンチネル値です。そうは言っても、あなたはそれをいくらか利用できると確信していますが、使いすぎだと思います。ただし、NULL 値を使用する場合、空の値を表現したい場所ならどこでも使用すると思います。

于 2009-01-02T02:43:53.820 に答える