sql boolean类型

关于 MySQL 的 boolean 和 tinyint(1)

boolean类型
MYSQL保存BOOLEAN值时用1代表TRUE,0代表FALSE,boolean在MySQL里的类型为tinyint(1),
MySQL里有四个常量:true,false,TRUE,FALSE,它们分别代表1,0,1,0,
mysql> select true,false,TRUE,FALSE;
+------+-------+------+-------+
| TRUE | FALSE | TRUE | FALSE |
+------+-------+------+-------+
|    1 |     0 |    1 |     0 |
+------+-------+------+-------+
可以如下插入boolean值:insert into [xxxx(xx)] values(true),当然也可以values(1);
举例如下:
mysql> alter table test add isOk boolean;
Query OK
mysql> desc test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| isOk  | tinyint(1)  | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
mysql> insert into test(isOk) values(true);
Query OK
mysql> select isOk from test ;
+------+
| isOk |
+------+
|    1 |
+------+
=================

MySQL没有boolean类型。这也是比较奇怪的现象。例:

create table xs
(
   id int primary key,
   bl boolean
)

这样是可以创建成功,但查看一下建表后的语句,就会发现,mysql把它替换成tinyint(1)。也就是说mysql把boolean=tinyInt了,但POJO类要定义成什么类型呢?
因为惯性思维,在java类中也把它定义成type。然后在Struts中使用<s:check/>标签。这就产生一个严重的问题了。<s:check>是boolean,而POJO去定义成byte。这样数据永远也无法提交,被struts的intercept拦截掉了。解决办法是在POJO类中定义成boolean,在mysql中定义成tinyint(1)。

------

TINYINT(1) or ENUM( ‘true‘ , ‘false‘)

-------

关于 MySQL 的 boolean 和 tinyint(1)

一、oracle本身没有boolean类型,就是说跟数据库相关的类型中不包括boolean,一般采用number(1)和char(1)来实现。
所 以”You   cannot   insert   the   values   TRUE and   FALSE   into   a   database   column.  Also,   you   cannot   select   or   fetch   column   values into   a   BOOLEAN   variable.“
plsql为了实现结构化编程,支持了boolean类 型,所以可能会出现的问题是一个存储过程或者函数的返回参数是boolean型的,但在call这个procedure的时候,无法注册boolean类 型的返回参数,执行时会抛出”参数类型不对“的exception,解决的方案就是把boolean的参数用别的类型代替。

不太明白oracle为什么不支持 boolean类型。

二、 一直被Oracle中没有boolean类型困扰,网上有两种解决方案,一是用Number(1),二是用Char(1),各有所长,个人比较喜欢用 Number方式解决,原因很简单,因为是从C语言开始的,这符合C语言的习惯。前几天有幸咨询到Oracle方面的顾问,他们提供的解决方案是用 Char(1)实现boolean,但也有需要注意的地方,原话如下:  如果是特定boolean类型情况下,Char(1)是比Number(1)更好的选择,因为前者所用的存储空间会比后者少,但这二者在查询时存储空间的 节省会提供查效率,但是要注意的是用Char(1)的时候不能让这个字段可以为空,必须有缺省,否则查询效率会降低

三、PL/SQL 中有boolean类型,有null类型
PL/SQL中是有Boolean类型的,只能取2个值:true和false;
存储过程中的变量也支持boolean型;
但数据库中没有boolean类型。

四、存储过程中:
declare 
v1 boolean;
begin 
v1:=1>2;
if(v1)then 
     dbms_output.put_line(‘true
‘);
else 
    dbms_output.put_line(‘false
‘);
end if;
end; 

打印:false
----------------------------------------
declare 
v1 boolean;
begin 
v1:=1>2;
dbms_output.put_line(v1);
end;

会报错。运行时得到错误信息:调用‘PUT_LINE‘ 时参数个数或类型错误。这是因为在脚本中不能直接打印boolean类型的值。

五:
oracle 没有boolean,mysql用bit(1)而oracle可以用char(1) check(...(0,1))字段,
如:

create table a ( a char(1) check (a in(0,1)))

然后JDBC用getBoolean()可以返回正确的结果。

JDBC我用ojdbc14.jar

ps:以上内容均引自网络,请尊重原作者,这里仅为学习。

Oracle sql语句中不支持boolean类型(decode&case)

SQL> show err;
Errors for FUNCTION IS1GT0:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3      PL/SQL: Statement ignored
5/10     PLS-00306: wrong number or types of arguments in call to ‘DECODE‘
SQL>

case完美通过:
SQL> CREATE OR REPLACE FUNCTION is1gt0
  RETURN VARCHAR2
IS
BEGIN
  RETURN CASE 1 > 0
    WHEN TRUE
      THEN ‘true‘
    ELSE ‘false‘
  END;
END;
/

Function created.

SQL> show err;
No errors.
SQL> select is1gt0 from dual;

IS1GT0
--------------------------------------------------------------------------------
true

SQL>

小结:
1. Oracle sql语句中不支持boolean类型;
2. decode是oracle独有的;而case是标准sql,mysql和sqlserver也可以使用,而且case还能把boolean转换输出。

时间: 2024-08-29 04:35:50

sql boolean类型的相关文章

SQL SERVER类型与C#类型对照

  SQL SERVER类型   C#类型 精确数字 bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. 约900亿亿,用的较少 Int64 int 从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字).存储大小为 4 个字节.int 的 SQL-92 同义字为 integer. Int3

Boolean类型

Boolean类型是与布尔值对应的引用类型.如果要创建Boolean对象,语法如下: var booleanObject = new Boolean(true); Boolean类型的实例重写了valueOf()方法,返回基本类型true或false:重写了toString()方法,返回字符串"true"和"false". 1.基本类型与引用类型 基本类型本质是boolean类型,而引用类型本质是对象,下面用代码来说明二者区别. 1 <script> 2

javascript类型系统——布尔Boolean类型

× 目录 [1]定义 [2]应用场景 [3]转为布尔[4]实例方法 前面的话 布尔值Boolean类型可能是三种包装对象Number.String和Boolean中最简单的一种.Number和String对象拥有大量的实例属性和方法,Boolean却很少.从某种意义上说,为计算机设计程序就是与布尔值打交道,作为最基本的事实,所有的电子电路只能识别和使用布尔数据.本文将介绍布尔Boolean类型 定义 布尔Boolean类型表示逻辑实体,它只有两个值,保留字true和false,分别代表真和假这两

Java中boolean类型占用多少个字节

为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就boolean类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,boolean类型在编译后会使用其他数据类型来表示,那boolean类型究竟占用多少个字节?带着疑问,随便网上一搜,答案五花八门,基本有以下几种: 1个bit 理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可

5.6.1 Boolean类型

Boolean类型是与布尔值对应的引用类型.要创建Boolean对象,可以像下面这样调用Boolean构造函数并传入true或false值. var booleanObject=new Boolean(); Boolean类型的实例重写了valueOf()方法,返回基本类型值true或false:重写了toString()方法,返回字符串“true”和“false”.可是,Boolean对象在ECMAScript中的用处不大,因为它经常会造成人们的误解.其中最常见的问题就是在布尔表达式中使用Bo

delphi编程里bool跟boolean类型的区别

原文来自: http://blog.csdn.net/shao9900/article/details/44000825 bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使用Boolean类型. 这四种类型的布尔值占用内存的数量如下: Boolean 1 Byte ByteBool 1 Byte WordBool 2 Bytes(1 Word) L

Javascript类型&mdash;&mdash;boolean类型

布尔值在Javascript中有两个值:true和false. 布尔值和其他数据类型的转换关系 数据类型 true false boolean true false String 任何非空字符串 "" Number 任何非零数字(包括正负无穷大,+-Infinity) 0和NaN Object 任何对象 null Undefined 无 undefined 转换方法是Boolean()方法. 在进行逻辑运算时,计算值会按照Boolean()的方法进行转换. Javascript类型——

学习小记:JS判断时特殊值与boolean类型的转换

扒开JQuery以及其他一些JS框架源码,常常能看到下面这样的判断, 写惯了C#高级语言语法的我,一直以来没能系统的理解透这段代码. var test; //do something... if(test){ //do something... } 此处就系统的记录一下这个JS特殊值与boolean类型的转换,测试代码与结果如下 window.onload = function () { var minusNum = -1; var zero = 0; var one = 1; var stri

Java中boolean类型到底占用多少字节

虽然 Java 虚拟机定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持.在 Java 虚拟机中没有任何供 boolean 值专用的字节码指令,在 Java 语言之中涉及到 boolean 类型值的运算,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替. Java 虚拟机直接支持 boolean 类型的数组,虚拟机的 newarray 指令可以创建这种数组.boolean 的数组类型的访问与修改共用 byte 类型数组的 baload 和 bastore 指令.