Oracle缺少表列的Bit数据类型

Mar*_*lan 26 oracle boolean

我是一个小型开发团队的开发人员,有些事情让我很生气,直到我决定采取行动......

Oracle不支持Bit数据类型 - 或者实际上在真/假场景中显而易见的任何其他内容.然而,在我加入团队之前,我的祖先决定使用char(1)字段,使用特定的字母来表示是/真.不幸的是,我们的应用程序已经被世界各地的人们所熟悉,并且由于坦率地无视我理解的所有尝试的原因,所使用的价值因本地化而异.

是的,我知道对于后端用户从未见过的值来说完全没有必要 - 但是...

我注意到,这种做法似乎越来越结转到新的发展,这令我疯狂 - 所以我想这不是提议号码(1,0)的 - 0被认为是假/没有,什么都被interpretted为真/是......

简单的问题 - 任何人都可以想到这可能是一个坏主意的原因吗?

虽然我们是关于它的,有谁知道为什么Oracle不支持简单的布尔类型?这不是一个明智的省略吗?

期待干杯,

马丁.

Sam*_*uel 27

使用CHAR(1)和约束只允许'1'和'0'.

...

col CHAR(1),
CONSTRAINT cons_atable_col1 CHECK (col1 IN ('1','0'))
Run Code Online (Sandbox Code Playgroud)


Álv*_*lez 16

我不是英国人,所以我倾向于使用1和0或'1'和'0'.如果你不是用英语编码,那么使用'Y'和'N'是没有意义的(是的,确实存在母语编码).使用'SI'和'NO'或'S'和'N'看起来并不专业(就像用重音字母命名变量一样).相反,如果您使用C,PHP或JavaScript进行编码,那么它们就是非常标准的.无论如何,我总是添加适当的约束来禁止任何其他角色.除了主观问题之外,我认为在选择CHAR或NUMBER时不会有明显的性能提升.我更喜欢数字,因为我不需要引用它们:)

我同意这是一个明显的遗漏,但我在一些Oracle论坛上读过关于这个主题的热烈讨论; 这是一种宗教问题.一些人声称布尔值属于应用程序数据类型,并且在数据库核心中没有位置.老实说,我相信这是我们在没有它的情况下如此长久的一个,我们最好说它是在目的上的东西.

顺便说一句,MySQL有一个BOOLEAN类型,但它是TINYINT(1)的同义词,所以它最终等于1和0; 这很好,因为它还有常量TRUE和FALSE,评估为1和0.

  • 为"我们已经如此长 - 没有它 - 我们曾经 - 它们更好 - 说它是用途"的+1我们应该用这句话来表达:WHBSLWITWHBSIWOP. (7认同)

Jen*_*der 11

我更喜欢char(1)而不是数字(1),因为通过一些合理的字符选择,很明显哪个字符具有哪个布尔含义.

当然,您应该对抗所有不同的变量,选择一个并通过对列进行检查约束来确保它的使用.

虽然在您的情况下可能要迟到,但从其他工具生成模式通常至少会考虑一致性问题.我个人更喜欢hibernate用于此目的,但这是特定情况.

当然,这是一个明显的遗憾.更糟糕的是,PL/SQL有一个布尔值,但你不能在SQL语句中使用它.


DCo*_*kie 9

以下是Ask Tom关于该主题的讨论.提供以Oracle为中心的问题视图.

至于存储,char(1)实际上有点(没有双关语意)更有效:

SQL> CREATE TABLE xx (c CHAR(1), n NUMBER);

Table created

SQL> insert into xx values('T', 1);

1 row inserted

SQL> select dump(c), dump(n) from xx;

DUMP(C)             DUMP(N)
------------------- -------------
Typ=96 Len=1: 84    Typ=2 Len=2: 193,2
Run Code Online (Sandbox Code Playgroud)

  • @Martin:我同意,没有合理的理由在数据库中排除BOOLEAN类型,只有实用的类型.Oracle在这个问题上有点精神分裂,因为他们的PL/SQL语言确实有BOOLEAN类型.仅这一点就是甲骨文程序员第一次碰到它时引起很大困惑的根源. (4认同)
  • 这非常有趣 - 而不是我的预期.我个人觉得数字更清晰......我在看到你的帖子(谷歌搜索)之前阅读了Ask Tom讨论,但我不同意他没有布尔/位的理由...... (3认同)
  • 谢谢你 - 不知道他们被存储为centesmimal ...我在这份工作之前的背景主要是关注MS-SQL,我不得不说在很多方面我开始想念它! (2认同)

Gil*_*ton 5

根据这个 Oracle 指南 - 您应该使用 NUMBER(3)。疯狂,但真实。

http://docs.oracle.com/cd/B19306_01/gateways.102/b14270/apa.htm