Oracle数据库中是否有类似于Ms SQL Server中BIT
数据类型的布尔类型?
Oracle数据库中是否有类似于Ms SQL Server中BIT
数据类型的布尔类型?
在23c版本(2023年)之前,Oracle的SQL(而不是PL/SQL)中不仅缺少布尔数据类型,而且他们也没有明确的建议要使用什么替代方法。请参见asktom上的this thread。从推荐CHAR(1) 'Y'/'N'
到当有人指出'Y'/'N'
取决于英语,而例如德国程序员可能会使用'J'/'N'
时,他们转而推荐NUMBER(1) 0/1
。
最糟糕的是,他们像捍卫''=NULL
愚蠢决定一样捍卫这个愚蠢决定。
Oracle 23c 最终在所有上下文中支持布尔数据类型,以及其他一些它与其他数据库相比著名缺乏的功能。
SQL> select true;
TRUE
-----------
TRUE
SQL> create table test1(a boolean);
Table created.
SQL> insert into test1 values (true),(false),(to_boolean(0)),(to_boolean('y'));
4 rows created.
但是空字符串问题将永远不会改变。
N
和 F
代替 ON
和 OFF
,因为 ON
和 OFF
首字母相同。 - JimmyBcreate 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个字节的空间。 - phil_wResultSet.getBoolean()
指定:如果指定的列具有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列,最好也使用数字。 - Crusha K. RoolALTER TABLE YourSchema.YourTable ADD (ColumnName NUMBER(1) DEFAULT 0 NOT NULL);
希望这能帮助到某个人。
boolean intToBool(int in) { return (in != 0); }
- Agi HammerthiefColumnName = 0
或 ColumnName = 1
,而不是 ColumnName = 0
或 ColumnName <> 0
。后者的语义对程序员来说不太友好。我还希望通过只有两个值来使查询优化器更简单。 - David Aldridge在Oracle数据库中没有布尔类型,但可以这样实现:
可以在列上设置检查约束。
如果您的表没有检查列,可以添加它:
ALTER TABLE table_name
ADD column_name_check char(1) DEFAULT '1';
当您添加一个注册时,默认情况下,此列的值为1。ALTER TABLE table_name ADD
CONSTRAINT name_constraint
column_name_check (ONOFF in ( '1', '0' ));
很遗憾,这不是在SQL层面完成的, 但在PL/SQL中有相应的功能。
不存在布尔类型,但你可以使用1/0(数字类型),或者'Y'/'N'(字符类型),或者'true'/'false'(varchar2类型)。
一种常见的节省空间的技巧是将 boolean 值存储为 Oracle 的 CHAR,而不是 NUMBER:
SELECT
中)之间共享数据类型,则该论点完全崩溃,因为有时将布尔值作为计算结果返回是绝对合适的,即使考虑到其他论点的情况。 - jpmc26