Oracle数据库中是否有任何布尔类型?

Ped*_*der 233 sql database oracle boolean sqldatatypes

Oracle数据库中是否有任何布尔类型,类似于BITMs SQL Server中的数据类型?

Eri*_*ler 253

不仅Oracle的SQL(不是PL/SQL)中缺少布尔数据类型,而且他们也没有明确建议使用什么代替.在asktom上看到这个帖子.从推荐CHAR(1) 'Y'/'N'他们切换到NUMBER(1) 0/1有人指出'Y'/'N'取决于英语的时候,而德国程序员可能会'J'/'N'改用.

最糟糕的是,他们捍卫这个愚蠢的决定,就像他们捍卫''=NULL愚蠢一样.

  • 但是''= NULL是假的!''IS NULL是真的.:) (13认同)
  • @Irfy最近,我看到`N`和`F`正在使用,因为`ON`和`OFF`以相同的字母开头...... (9认同)
  • 如果不是模糊的话,1/0至少不那么模糊. (8认同)
  • 有人可能会说,作为布尔值的替代,"T"/"F"更有意义 (6认同)
  • Michael-O:我已经看过好几次了.对我来说,它一直是0/1,但其他程序员更喜欢J/N. (我住在德语国家) (4认同)
  • 是的我知道你到底意味着什么,但我想讽刺地突出甲骨文的好奇概念. (4认同)
  • 使用与"Y/N"不同的东西,因为你的母语不是英语,因为同样的原因拒绝使用"SELECT","FROM","WHERE"等等. (3认同)
  • 我见过说法语的程序员也使用 O/N ......(O 代表 oui) (2认同)
  • 同样有趣的是,请允许我提一下,我曾经不得不在一排表格中存储大量布尔值(数百个),并成功将它们全部组合成少量NUMBER类型,访问并在某些情况下编制索引它们通过使用嵌入在视图中的BITAND函数单独使用.我不确定我是否会再次关心,但当时它非常酷.一个特别好的功能是能够找到有效匹配这些布尔值的100多个谓词的行,并使用单个谓词形式:"MY_NUMBER = 45439794". (2认同)
  • @ocramot:对于许多讲德语的程序员(在德语国家工作,在德语客户的软件上工作......),使用"J"和"N"非常有意义.这是你不得不期待的.顺便说一句,在SAP的世界中,惯例是使用"X"表示true,""表示false表示. (2认同)
  • 答案中有一个小故障,因为`''= NULL`不是真的,但`''IS NULL`是.))) (2认同)
  • @GACy20很明显,缺乏适当的布尔类型以及省略如何替换它的明确建议最终会导致各种奇怪的随机实现,就像您所描述的那样。熟悉 shell 脚本的人可能会想将 0 用作“true”,将所有其他数值用作 false,因为这就是 Linux shell(例如 bash)中的“if”命令的行为方式。 (2认同)

Boh*_*dan 49

不.

可以使用:

IS_COOL NUMBER(1,0)

1 - true
0 - false
Run Code Online (Sandbox Code Playgroud)

---享受Oracle

或者使用此处描述的 char Y/N.

  • 我更喜欢char(1),因为它占用的空间更少.您可以这样检查:`create table testbool(boolc char(1),booln number(1)); 插入testbool值('Y',1); 从testbool中选择dump(boolc),dump(booln);`存储CHAR:`Typ = 96 Len = 1:89`并且NUMBER:`Typ = 2 Len = 2:193,2`至少在12c中, NUMBER(1)可以使用2个字节...... (5认同)
  • 来自 Java 背景的 ResultSet.getBoolean() 的 JDBC 规范说:如果指定列的数据类型为 CHAR 或 VARCHAR 并且包含“0”,或者数据类型为 BIT、TINYINT、SMALLINT、INTEGER 或 BIGINT并且包含 0,则返回 false 值。如果指定列的数据类型为 CHAR 或 VARCHAR 并且包含“1”,或者数据类型为 BIT、TINYINT、SMALLINT、INTEGER 或 BIGINT 并且包含 1,则返回 true 值。-- 基于此,我会推荐“0/1”解决方案而不是“Y/N”。即使使用 CHAR 列,最好使用数字。 (4认同)

Ale*_*ens 35

根据Ammoq和kupa的答案,我们使用数字(1),默认值为0,不允许空值.

这是一个用于演示的添加列:

ALTER TABLE YourSchema.YourTable ADD (ColumnName NUMBER(1) DEFAULT 0 NOT NULL);
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.

  • 请注意,您也可以在其中存储-1.您可以在其上添加检查约束以将值限制为0和1. (14认同)
  • @DavidAldridge在布尔逻辑中,任何不为0(FALSE)的数字都相当于1(TRUE),因此存储什么数字并不重要,从而无需检查约束。添加一个从 int 返回布尔值的函数很简单: `boolean intToBool(int in) { return (in != 0); }` (2认同)
  • @AgiHammerthief是的,但是如果你想在"boolean"列上使用谓词找到行,我宁愿知道我的选项是`ColumnName = 0`或`ColumnName = 1`,而不是`ColumnName = 0`或`ColumnName <> 0` 最后一个的语义不是程序员友好的.我还想通过具有两个值来使查询优化器更简单. (2认同)

vc *_* 74 14

不是在SQL级别,这很可惜PLSQL中有一个


Rob*_*óes 13

不,Oracle数据库中没有布尔类型,但您可以这样做:

您可以对列进行检查约束.

如果您的表没有检查列,则可以添加它:

ALTER TABLE table_name
ADD column_name_check char(1) DEFAULT '1';
Run Code Online (Sandbox Code Playgroud)

添加寄存器时,默认情况下此列为1.

在这里你放一个限制列值的检查,只放1或0

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));
Run Code Online (Sandbox Code Playgroud)


kup*_*upa 9

不存在类型boolean,但是你可以使用1/0(类型号),或'Y'/'N'(类型char),或'true'/'false'(类型varchar2).


Kla*_*sen 5

在pl/sql中有一个布尔类型,但没有一个可以用作列的数据类型.


dam*_*mon 5

如果您将 Java 与 Hibernate 一起使用,那么使用 NUMBER(1,0) 是最好的方法。正如您在此处看到的,该值由 Hibernate 自动转换为布尔值。