Наилучший вариант - 0 и 1 (в виде чисел - другой ответ предлагает 0 и 1 в качестве CHAR для эффективности использования пространства, но для меня это слишком сложно), используя NOT NULL и проверочное ограничение для ограничения содержимого этими значениями. (Если вам нужно, чтобы столбец обнулялся, то вы имеете дело не с логическим значением, а с перечислением трех значений ...)
Преимущества 0/1:
- Независимый от языка. «Y» и «N» было бы хорошо, если бы все использовали это. Но они этого не делают. Во Франции они используют «O» и «N» (я видел это своими глазами). Я не программировал в Финляндии, чтобы видеть, используют ли они там «E» и «K» - без сомнения, они умнее этого, но вы не можете быть уверены.
- Соответствует практике в широко используемых языках программирования (C, C ++, Perl, Javascript)
- Играет лучше с прикладным уровнем, например, Hibernate
- Приводит к более сжатому SQL, например, чтобы узнать, сколько бананов готово к употреблению
select sum(is_ripe) from bananas
вместо select count(*) from bananas where is_ripe = 'Y'
или даже (юк)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Преимущества «Y» / «N»:
- Занимает меньше места, чем 0/1
- Это то, что предлагает Oracle, поэтому может быть, что некоторые люди более привыкли к
Другой автор предложил «Y» / ноль для повышения производительности. Если вы доказали, что вам нужна производительность, то достаточно справедливо, но в противном случае избегайте, так как это делает запросы менее естественными ( some_column is null
вместо some_column = 0
), и в левом соединении вы будете путать ложность с несуществующими записями.
wall
тип данных, чтобы я мог разбить себе голову при использовании логических значений.