昨天我想在Oracle表中添加一个布尔字段.但是,Oracle中实际上没有布尔数据类型.有没有人知道模拟布尔值的最佳方法?谷歌搜索主题发现了几种方法
使用整数,只是不要为它分配除0或1以外的任何东西.
使用带有"Y"或"N"的char字段作为唯一的两个值.
使用带有CHECK约束的枚举.
有经验的Oracle开发人员是否知道哪种方法是首选/规范的?
我发现此链接很有用.
以下是突出显示每种方法的一些优点/缺点的段落.
最常见的设计是模仿Oracle数据字典视图使用的许多类似布尔的标志,选择'Y'表示true,选择'N'表示false.但是,要与主机环境(如JDBC,OCCI和其他编程环境)正确交互,最好选择0表示false,1表示true表示它可以正常使用getBoolean和setBoolean函数.
基本上他们提倡方法2,为了效率,使用
值为 0/1(因为与JDBC的互操作性getBoolean()
等)和检查约束
一个类型 CHAR的(因为它使用更少的空间比NUMBER).
他们的例子:
create table tbool (bool char check (bool in (0,1)); insert into tbool values(0); insert into tbool values(1);`
Oracle本身使用Y/N作为布尔值.为了完整性,应该注意pl/sql有一个布尔类型,只有表没有.
如果您使用该字段指示是否需要处理记录,则可以考虑使用Y和NULL作为值.这使得索引非常小(读取速度快),占用的空间非常小.
要使用最少的空间,您应使用约束为"Y"或"N"的CHAR字段.Oracle不支持BOOLEAN,BIT或TINYINT数据类型,因此CHAR的一个字节尽可能小.
最好的选择是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'
甚至(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布尔运算变得非常容易.
如果你想与甲骨文头大佬之一这个问题的真正深入的讨论,查了一下汤姆凯特有说这个在这里