ChatGPT解决这个技术问题 Extra ChatGPT

Oracle 数据库中有布尔类型吗?

Oracle 数据库中是否有布尔类型,类似于 Ms SQL Server 中的 BIT 数据类型?

不幸的是,Oracle 在引入该标准时并不完全支持 ANSI SQL:1999 标准 (en.wikipedia.org/wiki/SQL:1999)。
替代观点(为什么 SQL 不应该具有布尔类型):vadimtropashko.wordpress.com/2010/09/16/…
@JeffreyKemp 该博客毫无意义。仅仅因为某些布尔值可以基于表中的其他字段计算,并不意味着可以计算所有布尔字段。例如“is_trusted_customer”,当且仅当一个人决定“我信任那个人”时,这是真的。
@JeffreyKemp 恭喜,您刚刚重新发明了 C 风格的布尔值(您使用 int 代替)。我们绝对应该回到代码中。此外,如果表列和 result 列(来自 SELECT)之间的数据类型是共享的,则该参数完全崩溃,因为有时甚至给定返回布尔值作为计算结果是绝对合适的其余的论点。
是的。像布尔值这样的更多数据类型会提供更精确的表达能力——在这方面你不会从我这里得到任何论据。我很高兴我们至少有一个 DATE 类型 - 想象一下必须一直处理日期的字符串表示:)

K
KAD

Oracle 的 SQL(不是 PL/SQL)中不仅缺少布尔数据类型,而且他们也没有明确的建议来代替使用什么。请参阅 asktom 上的 this thread。当有人指出 'Y'/'N' 取决于英语语言时,他们从推荐 CHAR(1) 'Y'/'N' 切换到 NUMBER(1) 0/1,而例如德国程序员可能会改用 'J'/'N'

最糟糕的是,他们为这个愚蠢的决定辩护,就像他们为 ''=NULL 愚蠢辩护一样。


1/0 是,如果不是模棱两可的话,至少不那么模棱两可。
但是 ''=NULL 是假的! '' IS NULL 为真。 :)
Michael-O:我已经看过好几次了。对我来说,一直是 0/1,但其他程序员更喜欢 J/N。 (我住在一个讲德语的国家)
@Irfy 最近,我看到 NF 被使用,因为 ONOFF 以相同的字母开头......
有人可能会争辩说,作为布尔值的替代品,“T”/“F”更有意义
B
Bohdan

没有。

可以使用:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- 享受甲骨文

或使用 char Y/N as described here


我更喜欢 char(1) 因为它使用的空间更少。您可以这样检查:create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; 存储的 CHAR:Typ=96 Len=1: 89 和 NUMBER:Typ=2 Len=2: 193,2 至少在 12c 中,NUMBER(1) 可以使用 2 个字节...
来自 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 列,也最好使用数字。
A
Alex Stephens

根据 Ammoq 和 kupa 的回答,我们使用默认值为 0 的 number(1) 并且不允许空值。

这是一个添加列来演示:

ALTER TABLE YourSchema.YourTable ADD (ColumnName NUMBER(1) DEFAULT 0 NOT NULL);

希望这可以帮助某人。


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

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

您可以在列上放置检查约束。

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

ALTER TABLE table_name
ADD column_name_check char(1) DEFAULT '1';

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

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

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));

v
vc 74

不在 SQL 级别,很遗憾虽然 PLSQL 中有一个


k
kupa

不,不存在 boolean 类型,但您可以使用 1/0(类型编号)或 'Y'/'N'(类型 char)或 'true'/'false'(类型 varchar2)取而代之。


K
Klaus Byskov Pedersen

有一个 boolean type for use in pl/sql,但没有一个可以用作列的数据类型。


S
Saša

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


P
Pranay Rana

一个常见的节省空间的技巧是将布尔值存储为 Oracle CHAR,而不是 NUMBER:


CHAR(1) 和 VARCHAR2(1) 在空间使用方面是相同的。
正如我在这里学到的docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html,当我们讲述一个字符时,只有 char 和 varchar 之间存在区别 - char 使用 1 个字节,但 varchar 使用 1 个字节作为空白空间 + 1 个字节作为一个字符 -> varchar(varchar2) 对 1 个字符使用 2 个字节<当 char 仅使用 1 个字节时
@Artem.Borysov:该手册适用于 MySQL,而不适用于 Oracle 数据库
F
Filburt

只是因为还没有人提到它:使用 RAW(1) 似乎也很常见。


raw(1) 很棒,因为用户不能假设其中有什么,进行查询的人必须了解 raw(1) 列中的内容并将其翻译成有意义的东西。
是的,它太棒了,你不能用它编写可移植的 jdbc 代码。
@jacob - 这是一个了不起的主意!我们应该摆脱所有其他数据类型并将所有内容存储在 RAW 列中!那么NOBODY可以任意曲解数据!
想象一下,如果在 oracle 中有某种方式来定义数据类型,以便我们可以创建一个包装 'raw(1)' 类型的 bool 类型,将其命名为 bool 或 boolean。然后我们可以定义一个函数来根据内容打印“真”或“假”。
z
zloctb
DECLARE
error_flag  BOOLEAN := false;
BEGIN

error_flag := true;
--error_flag := 13;--expression is of wrong type

  IF error_flag THEN 

UPDATE table_a SET id= 8 WHERE id = 1;

END IF;
END;

这个例子有效。我还注意到我只能在 PL/SQL 中使用布尔类型。 SQL 中的布尔调用不会,并且会产生无效的关系运算符错误。