当前位置:  开发笔记 > 编程语言 > 正文

Oracle中的布尔字段

如何解决《Oracle中的布尔字段》经验,为你挑选了5个好方法。

昨天我想在Oracle表中添加一个布尔字段.但是,Oracle中实际上没有布尔数据类型.有没有人知道模拟布尔值的最佳方法?谷歌搜索主题发现了几种方法

    使用整数,只是不要为它分配除0或1以外的任何东西.

    使用带有"Y"或"N"的char字段作为唯一的两个值.

    使用带有CHECK约束的枚举.

有经验的Oracle开发人员是否知道哪种方法是首选/规范的?



1> ColinYounger..:

我发现此链接很有用.

以下是突出显示每种方法的一些优点/缺点的段落.

最常见的设计是模仿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);`


作为*boolean*值,它们是不明显的.进程返回码不是布尔值.
我建议不要使用'N'和'Y',因为它取决于语言.英语人士有时会忘记世界上大多数人并不用字母Y代表真理的概念.相比之下,0和1的含义在语言障碍中是不变的.
为什么在这个答案中忽略了提供的链接中的整个段落?"最常见的设计是模仿Oracle数据字典视图使用的许多类似布尔的标志,选择'Y'表示true,选择'N'表示false.但是,要与主机环境正确交互,例如JDBC,OCCI,和其他编程环境一样,最好选择0表示false,1表示true表示它可以正常使用getBoolean和setBoolean函数." 他们声明虽然'Y/N'是常见的,但建议使用'0/1'来增加与主机环境的兼容性.
0和1作为布尔值在计算机科学中不一致 - shell脚本类型语言倾向于0为成功,非零为失败,而C类型语言往往为0为失败,非零为成功.

2> Leigh Riffel..:

Oracle本身使用Y/N作为布尔值.为了完整性,应该注意pl/sql有一个布尔类型,只有表没有.

如果您使用该字段指示是否需要处理记录,则可以考虑使用Y和NULL作为值.这使得索引非常小(读取速度快),占用的空间非常小.


+1使用Y/N关于Oracle内部视图和表的优点.如果Oracle这样做,那一定是对的!:)
在Oracle中没有对NULL进行索引,因此如果索引包含几个Y字符,但大多数为NULL,则索引的索引非常小.

3> Bill the Liz..:

要使用最少的空间,您应使用约束为"Y"或"N"的CHAR字段.Oracle不支持BOOLEAN,BIT或TINYINT数据类型,因此CHAR的一个字节尽可能小.



4> Andrew Spenc..:

最好的选择是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),并且在左连接中你会将错误与不存在的记录混为一谈.


我怀疑这些投票是由于选择最节省内存的实现的传统观点.这种日龄和内存的效率远没有优先考虑,在可用性和兼容性之后应该考虑在内.对于可能对此评论做出回应的任何人,我建议您阅读过早优化.这正是通过纯粹基于内存效率选择"Y/N"而发生的事情.由于该决定,您将失去与一组常用框架的本机兼容性.
你发现现在很多布尔人都是TriState,即真实,虚假和未知.这完全符合数据库null的想法.仅仅因为很多时候都不知道答案是非常重要的
如果你那么挑剔那么你可以为每种数据类型制作相同的参数.由于严格定义整数,双(我想我应该说双倍长度二进制补充浮点),二进制,字符串等都假设提供了一个值,但数据库实现总是添加一个空值选项布尔值没有任何不同

5> Matthew Wats..:

1/0或Y/N,带有检查约束.以太方式很好.我个人更喜欢1/0,因为我在perl中做了很多工作,这使得在数据库字段上进行perl布尔运算变得非常容易.

如果你想与甲骨文头大佬之一这个问题的真正深入的讨论,查了一下汤姆凯特有说这个在这里

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有