手记

Mysql中int与Java数据类型对应关系

Mysql中int与Java数据类型对应关系

1. mysql中int(11)和varchar(32) 括号中的数字代表的含义是一样的么 ?

  • 答:长度解释 其实是不一样的.int(1),int(4),int(11) 在磁盘上都是占用 4 btyes 的存储空间.

关于mysql数据库中,字段长度的一个解释,一直以为int长度为1时,只能插入0-9的数字,发现完全不是,具体如下:

1、varchar类型的长度是指这个字段的字符(字母或汉字)个数。

2、数字类型的长度不是这个意思:

(1)int类型 INT(M),M代表的是显示宽度,长度的设定值范围1255(设置0时自动转为11,不设置时自动转为默认的11)(显示宽度),在此范围内任意长度值的字段值范围都是-21474836482147483647(即-2³¹-1~2³¹-1)

(2)tinyint类型:长度设定值范围1255(设置0时自动转为4,不设置时自动转为默认的4)(显示宽度),在此范围内任意长度值的字段值范围都是-128127(-2⁷-1~2⁷-1)

也就是说:int(1)、int(4)、int(11)和int(110)表示意思是一样的。

要查看出不同效果记得在创建类型的时候加 zerofill这个值(INT(M) ZEROFILL),表示用0填充,否则看不出效果的


  • mysql使用整数数据的精确数字数据类型。

    数据类型 长度 位数 范围 默认值
    tinyint 1Byte 8 2^7-1(255) 0
    smallint 2Byte 16 -2^15 (-32,768) 到 2^15 – 1 (32,767) 0
    int 4Byte 32 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 0
    bigint 8Byte 64 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 0
  • java 基本类型

数据类型 长度 位数 默认值
byte 1Byte 8 0
short 2Byte 16 0
int 4Byte 32 0
long 8Byte 64 0
float 4Byte 32 0.0f
double 8Byte 64 0.0d
boolean - - false

2.mysql 中tinyint(1)使用场景

  • Mysql中,如果使用tinyint(1)来设置表中字段的数据类型,可以存储0和1;在Java中使用Boolean来接收,0映射为false,1映射为true。
  • Mysql中,如果使用tinyint来设置字段的数据类型,映射到Java数据类型中,不仅可以使用上面的Boolean类型来接收,也可以使用Java中int类型来接收。在MySQL中存储的tinyint(1)类型数据,不仅可以存储0和1,任意一个一位自然数都可以(0-9)。不过,当这样(tinyint(1))使用时,0映射为Java中的Boolean类型false,1-9数字都将映射为true。
  • tinyint(1)与tinyint(4)的区别:tinyint默认的位数是4位,但是我们设计数据库就算设置成tinyint(1)[(1)表示数据以一个长度来显示],但也不能影响它实际占了4个存储空间。tinyint(1) 和 tinyint(4)中的1和4只有字段指定zerofill(零填充)时才有效,不足位数用0来填充。其实他们的存储空间大小是一样的。如tinyint(4),如果实际值是2,如果列指定了zerofill,查询结果就是0002,左边用0来填充。

3. 非0和1存储场景:

字段:status(值为1,2,3,4)
类型:tinyint 长度:1(有符号的)
实际结果:查询出来的数据列表,状态值不管是1、2、3还是4,都是"boolean true"
期望结果:单纯的查询出数据列表取出数字。

  • 问题分析:
    由于MySql中没有boolean类型,所以会用到tinyint[1]类型来表示,在mysql中boolean=tinyint[1]

  • 解决方式:
    tinyint类型长度设置问题,当我把长度改成4时,查询结果就是我的期望结果了。

  • 其他思路:
    在不改变类型长度下,修改查询sql语句,在需要执行的sql语句中,把这个状态字段1,结果就会得到数据库存的值了(ps:要给这个修改后的状态字段加别名,不然查询出来的就是status1 => ‘1’)

  • 只存储0和1,表示true或false,则使用tinyint(1)
    存储状态信息1、2、3、4等,为使查询出的数据是原始的数字,有两种方式:
    A、修改tinyint类型的长度,使用tinyint(4)
    B、在查询的sql语句上面做修改

所以由这里可以看出,当使用tinyint(1)来存储超过0,1两个以外的值,比如存储2,那这个2就是脏数据。如果要2有效,就用tinyint(4)。tinyint(1)只适用于存储0和1两个值,也即真和假,true和false。
一般情况,如果存的是纯数字的话,建议用tinyint,如果是字符串,且是固定长度的,建议用char。

  • bit & tinyint:

两者都可以表示Java中的布尔值。
如果没有扩展需求,仅仅表示逻辑true或false的话,bit是首选;
如果有扩展需求,以后可能不仅仅是逻辑布尔两个值的话,就用tinyint(4)(长度根据业务来调整)。

0人推荐
随时随地看视频
慕课网APP