• 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')
    -------
     
     
    一、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:以上内容均引自网络,请尊重原作者,这里仅为学习。
     
     
    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转换输出。
     
     
     
  • 相关阅读:
    es6 学习笔记
    正则表达式 学习笔记
    knockout 学习笔记
    错误笔记
    zepto 学习笔记
    Dialog提示框
    setContentView( )方法
    SVG图形之几何图形——学习笔记2
    SVG图形之SVG文件如何嵌入HTML文档——学习笔记1
    getchar()的用法
  • 原文地址:https://www.cnblogs.com/jijm123/p/9500915.html
Copyright © 2020-2023  润新知