Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle数据库中是否存在布尔类型?_Sql_Database_Oracle_Boolean_Sqldatatypes - Fatal编程技术网

Sql Oracle数据库中是否存在布尔类型?

Sql Oracle数据库中是否存在布尔类型?,sql,database,oracle,boolean,sqldatatypes,Sql,Database,Oracle,Boolean,Sqldatatypes,Oracle数据库中是否有类似于Ms SQL Server中的位数据类型的布尔类型?不在SQL级别,这很遗憾 PLSQL中有一个,虽然有一个,但没有一个可以用作列的数据类型。一个常见的节省空间的技巧是将布尔值存储为Oracle字符,而不是数字:Oracle的SQL(不是PL/SQL)中不仅缺少布尔数据类型,但他们也没有明确的建议来替代什么。请参阅asktom。当有人指出'Y'/'N'取决于英语时,他们从推荐CHAR(1)'Y'/'N'切换到NUMBER(1)0/1,例如,德国程序员可能使用'J'

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

不在SQL级别,这很遗憾
PLSQL中有一个,虽然有一个,但没有一个可以用作列的数据类型。

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

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


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

不,布尔类型并不存在,但你可以用1/0(类型编号),或'Y'/'N'(类型字符),或'true'/'false'(类型varchar2)。

仅仅因为还没有人提到它:使用RAW(1)这似乎也是常见的做法。

可以使用:

IS_COOL NUMBER(1,0)

1 - true
0 - false
---享受神谕


或者使用字符Y/N

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

这里有一个添加列来演示:

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

希望这对别人有帮助

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

可以对列设置检查约束

如果您的表没有check列,则可以添加该列:

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' ));

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

CHAR(1)和VARCHAR2(1)在空间使用上是相同的。正如我在这里讲述一个CHAR时了解到的,CHAR和varchar之间只存在差异-CHAR使用1个字节,但是varchar使用1个字节表示空白空间+1个字节表示一个字符->varchar(VARCHAR2)当char仅使用1时,1个字符使用2个字节N
F
,因为
ON
OFF
以同一个字母开头……有人可能会说,作为布尔值的替代,'T'/'F'更具意义,因为Oracle在引入ANSI SQL:1999标准()时并不完全支持该标准。另一种观点(为什么SQL不应具有布尔类型):@JeffreyKemp,该博客是非理性的。仅仅因为一些布尔值可以基于表中的其他字段进行计算,并不意味着可以计算所有布尔字段。例如,“是值得信任的客户”,当且仅当一个人决定“我信任那个人”时,这才是真的。@JeffreyKemp恭喜你,你刚刚重新发明了C风格的布尔(你使用的是
int
s)。我们绝对应该回到那些代码中。此外,如果表列和结果列之间的数据类型(来自
SELECT
)是共享的,则参数会完全分离,因为返回布尔值作为计算结果是绝对合适的,有时甚至给出了参数的其余部分。是。更多的数据类型(如布尔型)将提供更精确的表达能力——在这方面我不会有任何论据。我很高兴我们至少有了一个
DATE
类型-想象一下,我们必须一直处理日期的字符串表示:)raw(1)很棒,因为用户不能假设其中包含什么,进行查询的人必须理解raw(1)中包含什么列并将其翻译成有意义的内容。是的,它太棒了,以至于你无法用它编写可移植的jdbc代码。@jacob-这是一个了不起的想法!我们应该摆脱所有其他数据类型,并将所有内容存储在原始列中!那么没有人可以任意曲解数据!想象一下,如果oracle中有某种方法来定义数据类型,这样我们就可以创建一个bool类型来包装“raw(1)”类型,将其命名为bool或boolean。然后,我们可以定义一个函数,根据内容打印“真”或“假”。请注意,您也可以在其中存储-1。您可以在此基础上添加检查约束,以将值限制为0和1。@Davidardridge在布尔逻辑中,任何非0(FALSE)的数字都等于1(TRUE),因此存储的数字不重要,因此不需要检查约束。添加一个从int返回布尔值的函数很简单:
Boolean intToBool(int in){return(in!=0);}
@True,但是如果您想使用“Boolean”列上的谓词查找行,我宁愿知道我的选项是
ColumnName=0
ColumnName=1
,而不是
ColumnName=0
ColumnName 0
。最后一个的语义对程序员不友好。我还希望通过使用两个值使查询优化程序更简单。我还注意到,我只能在PL/SQL中使用布尔类型。SQL中的布尔调用不会,并且会产生一个无效的关系运算符错误。我更喜欢char(1),因为它使用更少的空间。您可以这样检查:
createtabletestbool(boolcchar(1),boolnnumber(1));插入testbool值('Y',1);从testbool中选择dump(boolc)、dump(booln)
存储的字符:
Typ=96 Len=1:89
和该数字:
Typ=2 Len=2:193,2
至少在12c中,数字(1)可以使用2个字节。。。
ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));