数值类型

MySQL的数值类型包括整数类型、浮点数类型、定点数类型、位类型。

整数类型

MySQL支持的整数类型有tinyint、smallint、mediumint、int、bigint(范围从小到大)。

zerofill

我们在定义整数类型时可以在类型名称后面的小括号内指定显示宽度,例如int(5),当插入的数值宽度小于5位时,MySQL会在数值前面填充缺少的宽度。

显示宽度一般是配合zerofill来使用,当插入的数值位数未达到指定的显示宽度时,缺少几位就会在数值前填充几个0

我们创建表t_1,两个字段分别为id1和id2,都是int类型。其中id2我们指定了显示宽度为5,而id1没有手动指定显示宽度,因此它的显示宽度会取默认值11。

我们向表中插入一条数据后再将其查询出来,虽然现在id1和id2查询出来的数值都是1,但id1的数值1前面10位都被填充了宽度,id2的数值1前面4位被填充宽度。

为了更加直观的看到填充宽度的效果,我们将id1和id2的定义稍作修改,使用zerofill来填充宽度。

在使用了zerofill后,我们可以看到数值前面被0填充宽度的效果。这里引发一个疑问,我们在进行查询时使用1或00001作为条件可以得到结果吗?

可以看到在使用1或00001作为查询条件时,能查出id2对应的数值。这里要注意的是在MySQL中实际存储的值仍然是1,而不是00001,因为00001并不是一种整数的表现形式,而是一种字符串的表现形式,00001只是在设置了zerofill后的一种格式化输出而已,下面的截图将证明这个问题。

我们在查询时使用hex()函数作为对比,可以看到使用hex()函数得到的值是1,假若hex()得到的值是3030303031(字符串1的16进制为31,字符串0的16进制为30),则可以肯定在MySQL中是以00001的字符串形式进行存储的,但很明显这里并不是。

注:hex()函数可以将一个数字或字符串转换为十六进制格式的字符串

对于指定显示宽度的做法,这里引发一个疑问,在id2定义为int(5)的情况下,如果插入超过显示宽度的值,会怎么样呢?

向id2插入长度为6位的数值111111时,MySQL没有报任何错误也没有将111111截断,因此说明显示宽度并不会对插入的数值长度产生限制,两者并没有什么关系,除非插入的数值超过了数据类型的范围。

可以看到虽然插入成功但MySQL有一个警告(当MySQL的SQL Mode为严格模式时,该插入行为将不能够被完成,同时MySQL会报ERROR),我们在将数据查询出来时可以看到MySQL对原本插入的数据进行了截取,保留值为4294967295。

注:int数据类型有符号的最小值为-2147483648,最大值为2147483647,无符号的最小值为0,最大值为4294967295

知识点总结:

其实对于显示宽度来说,只有配合使用zerofill,显示宽度才有意义,否则就让显示宽度为默认值就可以了。不要以为指定显示宽度会对整数类型的取值范围有什么影响,两者之间没有任何关系,对整数类型的取值范围有影响的是unsigned属性。

unsigned

当我们在定义整数类型时使用了zerofill,MySQL会为我们自动对该列再添加unsigned(见下面截图)。这是因为当使用了zerofill后,插入该列的值就不可能为负数了,因此自动添加unsigned是可以理解的,同时unsigned也会增加整数类型最大值的取值范围。

auto_increment

整数类型还有一个属性就是auto_increment,而且这个属性还是整数类型特有的。auto_increment的作用就是使列值保持自动增长,auto_increment的值默认从1开始,也可以手动设置其初始值。对被设置为auto_increment的列插入null值时,实际插入的值是正常进行自动增长的那个值。

当一个列被设置为auto_increment时,通常还需要为该列设置not null和primary key(主键,一般被设置为auto_increment的列会作为主键使用)。另外需要提醒的是一张表中最多只能有一个字段被设置为auto_increment。

MySQL学习分享--数值类型的更多相关文章

  1. MySQL学习分享--Thread pool实现

    基于<MySQL学习分享--Thread pool>对Thread pool架构设计的详细了解,本文主要对Thread pool的实现进行分析,并根据Mariadb和Percona提供的开 ...

  2. MySQL学习分享-->日期时间类型

    日期时间类型 ①如果要用来表示年月日时分秒,一般使用datetime类型: ②如果要用来表示年月日,一般使用date类型: ③如果要表示时分秒,一般使用time类型: ④如果只是表示年份,一般使用ye ...

  3. sqoop mysql导入hive 数值类型变成null的问题分析

    问题描述:mysql通过sqoop导入到hive表中,发现有个别数据类型为int或tinyint的列导入后数据为null.设置各种行分隔符,列分隔符都没有效果. 问题分析:hive中单独将有问题的那几 ...

  4. MySql学习之varchar类型

    MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定),在 MySQL5.0以上的版本中,varchar数据 ...

  5. MySQL学习分享-->查询-->查询的分类

    MySQL的查询可以分为交叉联接.内联接.外联接.自然联接.straight_join 下面对于查询的学习,会用到以下四张表: create table t_commodity_type( `id` ...

  6. MySql学习---数据库基本类型,事务,多表查询

    数据库分类 关系型数据库 行列, 列如Mysql,oracle 通过表和表之间,行和列之间的关系进行数据的存储 非关系型数据库: Redis,MongDb 以对象存储,同过对象的自身属性来决定 表与表 ...

  7. MySQL学习分享-->查询-->查询的原理

    查询的原理 在一个查询中常包含下述子句: 1.select,2.distinct,3.join,4.on,5.from,6.where,7.having,8.group by,9.order by,1 ...

  8. MySQL学习——数据类型

    MySQL学习——数据类型 摘要:本文主要学习了MySQL数据库的数据类型. 整数类型 MySQL主要提供的整数类型有tinyint.smallint.mediumint.int.bigint,其属性 ...

  9. MySQL学习进阶

    存储引擎 MyISAMMySQL 5.0 之前的默认数据库引擎,最为常用.拥有较高的插入,查询速度,但不支持事务 InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5. ...

随机推荐

  1. php AES 加密类

    <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB ...

  2. "SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名"转

     "SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名" 2014-06-12 12:01:10 最近在学习SQL SERVER的高级复制技术的时候 ...

  3. BootstrapTable(附源码) Bootstrap结合BootstrapTable的使用,分为两种模试显示列表。

    引用的css: <link href="@Url.Content("~/Css/bootstrap.min.css")" rel="styles ...

  4. mysql表名忽略大小写

    安装完数据库,建表查询发现表不存在,原来是表名大小写写错了,原来Linux下的MySQL默认是区分表名大小写的,这样的话对变成灰带来很大的不变,如何才能使mysql表名不区分大小写呢? 通过如下设置, ...

  5. github使用介绍

    github是个比较火的分布式版本管理工具,适合多人协同工作,感觉比svn好.下面简单介绍一下github使用以及把本地代码和github同步的方法. 首先注册账号 https://github.co ...

  6. CodeForces462B

    Appleman and Card Game Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & % ...

  7. Redis 介绍与安装

    Redis  是Key-Value 类型的内存数据库,支持多数据结构,性能非常出色,每秒处理十万次读写操作. 整个大致的过程是: 整个数据库加载到内存中,操作之,通过异步定期处理数据库数据的刷新到硬盘 ...

  8. Kafka 0.10 Producer网络流程简述

    1.Producer 网络请求 1.1 Producer Client角度 KafkaProducer主要靠Sender来发送数据给Broker. Sender: 该线程handles the sen ...

  9. uml系列图(一)——与uml的第一次约会

    uml视频终于开始看了,再看之前先大概了解了一下uml都有啥. 老规矩,有图有真相: 暂时的理解就这么多,等到uml看完的时候总结跟现在这张图比一下,应该是有很大的区别吧. uml是一种可视化的建模语 ...

  10. 初探Lambda表达式/Java多核编程【2】并行与组合行为

    今天又翻了一下书的目录,第一章在这之后就结束了.也就是说,这本书所涉及到的新的知识已经全部点到了. 书的其余部分就是对这几个概念做一些基础知识的补充以及更深层次的实践. 最后两个小节的内容较少,所以合 ...