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使用整数数据的精确数字数据类型。

    数据类型长度位数范围默认值
    tinyint1Byte82^7-1(255)0
    smallint2Byte16-2^15 (-32,768) 到 2^15 – 1 (32,767)0
    int4Byte32-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647)0
    bigint8Byte64-2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807)0
  • java 基本类型

数据类型长度位数默认值
byte1Byte80
short2Byte160
int4Byte320
long8Byte640
float4Byte320.0f
double8Byte640.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)(长度根据业务来调整)。

作者:|jackssybin|,原文链接: http://www.imooc.com/article/325413

文章推荐

流量劫持 - GZIP 页面零开销注入 JS

如何让Task在非线程池线程中执行?

「学习笔记」线段树标记永久化

Java SpringBoot 加载 yml 配置文件中字典项

c++基本数据结构

CSS样式中颜色与颜色值的应用

Go如何自动解压缩包?如何读取docx/doc文件内容?

如何高效实现 MySQL 与 elasticsearch 的数据同步

记录一次线上gitlab11.x升级gitlab14.x版本操作

驱动开发:内核枚举进程与线程ObCall回调

Vben Admin 源码学习:项目初始化

探究MySQL中SQL查询的成本