最好的选择是0和1(作为数字 - 另一个答案建议0和1作为空间效率的CHAR但是's a bit too twisted for me), using NOT NULL and a check constraint to limit contents to those values. (If you need the column to be nullable, then it'不是你正在处理的布尔值,而是具有三个值的枚举......)
导致更简洁的SQL,例如,找出准备吃多少香蕉 select sum(is_ripe) from bananas 而不是 select count(*) from bananas where is_ripe = 'Y' 或甚至(yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas
8 回答
我发现this链接很有用 .
以下是突出显示每种方法的一些优点/缺点的段落 .
基本上他们提倡方法2,为了效率,使用
值为0/1(由于与JDBC的
getBoolean()
的互操作性)和检查约束一种CHAR(因为它占用的空间比NUMBER少) .
他们的例子:
Oracle本身使用Y / N作为布尔值 . 为了完整性,应该注意pl / sql有一个布尔类型,只有表没有 .
如果您使用该字段指示是否需要处理记录,则可以考虑使用Y和NULL作为值 . 这使得索引非常小(读取速度快),占用的空间非常小 .
要使用最少的空间,您应使用约束为“Y”或“N”的CHAR字段 . Oracle不支持BOOLEAN,BIT或TINYINT数据类型,因此CHAR的一个字节尽可能小 .
最好的选择是0和1(作为数字 - 另一个答案建议0和1作为空间效率的CHAR但是's a bit too twisted for me), using NOT NULL and a check constraint to limit contents to those values. (If you need the column to be nullable, then it'不是你正在处理的布尔值,而是具有三个值的枚举......)
0/1的优点:
语言无关 . 'Y'和'N'如果每个人都使用它会没问题 . 但是他们没有在芬兰编程,看看他们是否在那里使用'E'和'K' - 毫无疑问他们确实是这样 .
与广泛使用的编程语言(C,C,Perl,Javascript)的实践一致
使用应用程序层进行更好的播放,例如过冬
导致更简洁的SQL,例如,找出准备吃多少香蕉
select sum(is_ripe) from bananas
而不是select count(*) from bananas where is_ripe = 'Y'
或甚至(yuk)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
'Y'/'N'的优点:
占用的空间少于0/1
这是Oracle建议的,所以可能是一些人更习惯的东西
另一张海报建议'Y' / null以获得性能提升 . 如果你已经证明你需要性能,那么公平,但另外避免,因为它使查询不那么自然(
some_column is null
而不是some_column = 0
),并且在左连接中你将把错误与不存在的记录混为一谈 .1/0或Y / N,带有检查约束 . 以太方式很好 . 我个人更喜欢1/0,因为我在perl中做了很多工作,这使得在数据库字段上进行perl布尔运算变得非常容易 .
如果你想与Oracles的一位主持人一起深入讨论这个问题,请查看Tom Kyte对此有何看法Here
数据库我做了大部分工作,用'Y'/'N'作为布尔值 . 通过该实现,您可以实现一些技巧:
计算为真的行:
SELECT SUM(BOOLEAN_FLAG = 'Y'然后1 ELSE 0)从X开始
对行进行分组时,强制执行"If one row is true, then all are true"逻辑:
从MAX中选择MAX(BOOLEAN_FLAG)
相反,如果一行为假,则使用MIN强制分组为false .
通过将"Boolean"列添加到oracle数据库中的现有表(使用
number
类型)来实现接受的答案的工作示例:这将在
my_table_name
中创建一个名为my_new_boolean_column
的新列,其默认值为0.该列不接受NULL
值,并将接受的值限制为0
或1
.在我们的数据库中,我们使用枚举来确保我们将其传递为TRUE或FALSE . 如果你这样做的话前两种方式很容易开始为整数添加新的含义而不经过适当的设计,或者最终得到具有Y,y,N,n,T,t,F,f值的char字段记住哪个代码段使用哪个表以及它使用的是哪个版本的true .