回答:
を使用NULL
すると、「データを入力しない」と「空のデータを入力する」を区別できます。
さらにいくつかの違い:
A LENGTH
のNULL
IS NULL
、LENGTH
空の文字列のです0
。
NULL
sは空の文字列の前にソートされます。
COUNT(message)
空の文字列はカウントしますが、NULL
s はカウントしません
バインドされた変数を使用して空の文字列を検索できますが、は検索できませんNULL
。このクエリ:
SELECT *
FROM mytable
WHERE mytext = ?
クライアントから渡される値に関係なく、NULL
in mytext
に一致することはありません。NULL
s を照合するには、他のクエリを使用する必要があります。
SELECT *
FROM mytable
WHERE mytext IS NULL
あなたがあれば検討することの一つは、これまでのデータベースを切り替えることを計画し、ということであるOracleは空の文字列をサポートしていません。これらは自動的にNULLに変換され、などの句を使用してクエリすることはできませんWHERE somefield = ''
。
Steve B.
::この質問を参照stackoverflow.com/questions/1171196/...
注意すべき点の1つは、NULLはコードパスをはるかに困難にする可能性があることです。たとえばPythonでは、ほとんどのデータベースアダプタ/ ORMはにマップさNULL
れNone
ます。
したがって、次のようなもの:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
「Hello、None Joe Doe!」になるかもしれません これを回避するには、次のようなコードが必要です。
if databaserow.title:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
print "Hello, %(firstname) %(lastname)!" % databaserow
これは物事をより複雑にすることができます。
NULL
MySQLのデータベースの整合性を保つために挿入するほうがよい。外部キーはNULL
空の文字列として保存できますが、保存することはできません。
制約の空の文字列に関する問題が発生します。外部キー制約を満たすために、一意の空の文字列を持つ偽のレコードを挿入する必要がある場合があります。悪い習慣だと思います。
ここでどのようなベストプラクティスになるかわかりませんが、nullを空の文字列とは異なるものにしたい場合や、ユーザーの入力が空の文字列の定義と一致しない限り、通常はnullを優先します。
あなたがあなたがそれらをどのように違うものにしたいかを定義する必要があると私が言っていることに注意してください。それらを異なるものにすることが理にかなっている場合とそうでない場合があります。そうでない場合は、1つを選んでそれを使用してください。私が言ったように、私はほとんどの場合NULLを支持する傾向があります。
ああ、そして列がnullの場合、選択がnull列に対するものでない限り、その列に基づいて選択する(SQL用語ではwhere句がある)実質的にすべてのクエリにレコードが表示される可能性が低いことを覚えておいてください。もちろん。
一意のインデックスで複数の列を使用していて、これらの列の少なくとも1つが必須(つまり、必須のフォームフィールド)である場合、インデックスの他の列をNULLに設定すると、行が重複する可能性があります。これは、一意の列ではNULL値が無視されるためです。この場合、重複する行を避けるために、一意のインデックスの他の列で空の文字列を使用します。
一意のインデックスの列: (event_type_id、event_title、日付、場所、URL) 例1: (1、 'BBQ'、 '2018-07-27'、null、null) (1、 'BBQ'、 '2018-07-27'、null、null)//許可され、複製されます。 例2: (1、 'BBQ'、 '2018-07-27'、 ''、 '') (1、 'BBQ'、 '2018-07-27'、 ''、 '')//重複しているため許可されません。
ここにいくつかのコードがあります:
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`event_title` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
`url` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
これを挿入して、複製された行が許可されることを確認します。
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
これを挿入して、許可されていないことを確認します。
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
ですから、ここに正誤はありません。ビジネスルールに最適なものを決定するのはあなた次第です。