关于 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;
关于 MySQL 的 boolean 和 tinyint(1)
可以如下插入boolean值:insert into [xxxx(xx)] values(true),当然也可以values(1);

可以如下插入boolean值:insert into [xxxx(xx)] values(true),当然也可以values(1);
举例如下:

随便找了一个表:test,里面只包含了一个id字段。

mysql> alter table test add isOk boolean;

关于 MySQL 的 boolean 和 tinyint(1)
mysql> insert into test(isOk) values(true);
Query OK
mysql> select isOk from test ;
关于 MySQL 的 boolean 和 tinyint(1)

MySQL没有boolean类型。这也是比较奇怪的现象。例:
create table xs
(
id int primary key,
bl boolean
)
这样是可以创建成功,但查看一下建表后的语句,就会发现,mysql把它替换成tinyint(1)。
关于 MySQL 的 boolean 和 tinyint(1)

也就是说mysql把boolean=tinyInt了,但POJO类要定义成什么类型呢?

因为惯性思维,在java类中也把它定义成type。然后在Struts中使用<s:check/>标签。这就产生一个严重的问题了。<s:check>是boolean,而POJO去定义成byte。这样数据永远也无法提交,被struts的intercept拦截掉了。解决办法是在POJO类中定义成boolean,在mysql中定义成tinyint(1)。

这也是我今天看到别人在项目里使用三目运算符的时候,使用了这个itemCat.getIsParent()?"close":"open",当时第一眼是很懵逼的,因为我看了数据库中is_parent这个字段的值明明是1和0,这个怎么能用来作为三目运算符的判断标志呢?那个明明是Boolean类型的,我开始怀疑是不是三目运算符还能这样用,1代表true,0代表false???

然后我特意去百度了一下java三目运算符的使用方法,我没有记错,三目运算符的判断条件就是Boolean类型的,但是这个怎么能这么用呢?带着这个疑问我看了一下实体类中的isParent属性,发现这个属性是Boolean类型的,但是数据库里却是tinyint,于是便再次百度。

然后找到了这篇博客:https://www.cnblogs.com/lykbk/p/sdafsdfdf3454354.html
很简单,也很清晰,看了之后明白了,这原来是mysql的问题,mysql中没有boolean类型,boolean在MySQL里的类型为tinyint(1)。并且还真的是1代表true,0代表false。

啰嗦了这么多,其实就是实体类属性照常使用Boolean类型,数据库字段使用tinyint类型,内容为0和1,就可以了。

程序员小白一个,虽然每天都能遇到新的bug,但是也只有遇到bug才能不断学习。你也要加油阿!