1.为什么要定义MySQL数据类型

定义MySQL数据类型其实就是为了对数据进行分类,实现对不同的分类进行不同的处理

1、使系统能够根据数据类型来操作数据。
2、预防数据运算时出错。例如,通过强大的数据分类把每个类型不特定的行为联系在一起,执行这些行为时,数据分类可以预防错误。最长见的错误是字符不数字相加。
3、更有效的利用空间。数据分类,可以使用最少的存储,来存放数据,同时提高了性能。 例如,把12345678901234567 识别为一个(8字节)数字,而不是一个17字节的字符串,1个字符占用一个字节。

定义数据类型的本质上是在定义列

2.mysql数据类型分类

mysql的数据类型大致分为:数值,字符串,enum枚举,set集合,时间

2.1 数值类型

bit[(m)]
二进制位,m表示二进制的长度(1-64),默认m=1 tinyint[(m)][unsigned][zerofill]
小整数,数据类型用于保存一些范围内的整数数值范围
有符号:-128~127
无符号:0~255
特别的:MySQL中无布尔值,使用tinyint(1)构造 int[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围
有符号:-2147483648~2147483647(2的31次方)
无符号:0~4294967295(2的32次方)
特别的:整数类型中的m仅用于显示,对存储范围无限制
例如:int(5),表示插入数据时,数据的长度为5位 bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围
有符号:-2**63 ~ 2**63
无符号:0~2**64 decimal[(m[,d])][unsigned][zerofill]
准确的小数值,m是数字的个数,d是小数点后个数,m最大值为65,d最大值为30.
特别的:
对于精确数值计算时需要用此类型
decimal能够存储精确值的原因在于其内部按照字符串存储
用来存储精确的小数,消耗空间,运算慢,一般想办法使用bigint替代它 float[(m,d)][unsigned][zerofill]
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数
无符号:
-3.402823466E+38 to -1.175494351E-38
0
1.175494351E-38 to 3.02823466E+38
有符号:
0
1.175494351E-38 to 3.402823466E+38
需要注意的是,数值越大,表示的数值越不准确 double[(m,d)][unsigned][serofill]
双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数
数值越大,越不准确

在MySQL中支持的5个主要整数类型是TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。

这些类型在很大程度是相同的,只有他们存储的值的大小是不同的

整型属性<修饰符>:
unsigned 无符号整数,修饰符: 规定字段只能保存正的数据。它可以增大这个字段的正数支持的范围。
比如:tinyint unsigned 可以存储的范围是0-255,而tinyint的存储范围是-128-127 zerofill 修饰符: 规定0(不是空格 ) 填补输出的值。 使用这个值可以防止 mysql存储负值。

2.2 字符串:

char(m)
char表示固定长度的字符串,可以包含最多达255个字符,其中m代表字符串的长度
即使数据小于m长度,存储后也会占用m长度 varchar(m)
varchar用于变长的字符串,可以包含最多255个字符,其中m代表该数据类型所允许保存的字符串的最大长度
只要长度小于该最大值的字符串都可以被保存在该数据类型中
需要注意的是,虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度比varchar类型更快 text
text数据类型用于保存变长的大字符串,可以组到65535(2**16-1)个字符
text类型及其子类型用于存储比较长的非二进制字符串
可以把text类型理解为VARCHAR的加长增强版
text类型不区分大小写 mediumtext
mediumtext类型数据也是用来保存变长的大字符串,最长可以表示
(2**24-1)个字符 longtext
longtext数据类型也是用来保存变长的大字符串,最长可以表示(2**32-1)个字符

字符串类型修饰符:

binary 修饰符: 区分字符大小。比较char类型以一个二进制方式起作用。

char和varchar区别:

  1. 空间:char(m)定义的列的长度为固定的,m取值可以为0~255之间,当保存char值时,在它们的右边填充空格以达到指定的长度。当检索到char值时,尾部的空格被删除掉。

    varchar(m)定义的列的长度为可变长字符串,m取值可以为0~65535之间,(varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。

    varchar值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。varchar值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。

    例:

    varchar(10),实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。如果列声明的长度超过255,则使用两个字节。

  2. 从效率上考虑,用char合适。

  3. 对于不同存储引擎有不同的说法:

    对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间;

    对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个表头部分存放着指向各有关数据列的指针),所以使用char类型不见得会比使用varchar类型好。事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利.

2.3 enum

枚举类型,其最大可以包含65535个不重复的成员,但是实际被限制小于3000个成员
enum类型存储的数据好比是单项选择题里的选项。其存储的值为表创建时在列规定中枚举的一列值,只能取一个,用于互斥。

2.4 set

集合类型,其最大可以包含64个不重复的成员,能选取多个
在set中,相关的元素不能同时存在。

2.5 时间类型:

date
YYYY-MM-DD,支持的范围是从 '1000-01-01' 到 '9999-12-31'
例如:2017-07-24 time
HH:MM:SS
例如:14:35:33 year
YYYY,1970 Unix诞生。这一年称为: 计算机元年
例如:2017 datetime
YYYY-MM-DD HH:MM:SS
例如:2017-07-25 15:55:22 timestamp
YYYYMMDD HHMMSS
例如:20170725 15:55:20

datetime类型与timestamp类型的区别

datetime类型能保存大范围的值,从1001年到9999年,精度为秒,它把日期和时间封装到格式为`YYYY-MM-DD HH:MM:SS`的整数中,与时区无关,使用8个字节的存储空间

timestamp类型保存了从1970年1月1日午夜(格林尼治时间) 以来的秒数
它和linux时间戳相同,timestamp只使用了4个字节的存储空间,因此它的范围比datetime小的多,只能表示从1970-2038,通常我们还是用它的,提高空间利用率

如果要查询时间戳SELECT unix_timestamp('1999-11-12 23:23:45');

3.扩展:linux时间戳

[root@mysql ~]# date +%s						// 显示系统当前时间戳
1535272562
[root@mysql ~]# date -d "2017-10-06 17:48:23" +%s // 把指定时间转换为时间戳
1507326503
[root@mysql ~]# date -d "1970-01-01 08:00:00" +%s // 把指定时间转换为时间戳
46800
[root@mysql ~]# date -d"@1455455465" // 把时间戳转换为日期
Sun Feb 14 08:11:05 EST 2016
[root@mysql ~]# date -d"@1455455465" "+%Y/%m/%d %H:%M:%S" // 把时间戳转换为日期
2016/02/14 08:11:05
[root@mysql ~]# date -d"@1455455465" "+%Y-%m-%d %H:%M:%S" // 把时间戳转换为日期
2016-02-14 08:11:05

MySQL/MariaDB数据类型的更多相关文章

  1. 流程控制语句(MySQL/MariaDB )

    本文目录:1.BEGIN...END2.true和false3.if结构4.case结构5.loop.leave和iterate6.repeat循环7.while循环 MySQL/MariaDB中的符 ...

  2. 关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)

    数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统——RDBMS: 主要 ...

  3. MySQL/MariaDB系列文章目录

    以下是本系列文章的大纲,此页博文完全原创,花费了作者本人的极大心血,如转载,请务必标明原文链接. 如果觉得文章不错,还请帮忙点下"推荐",各位的支持,能激发和鼓励我更大的写作热情. ...

  4. MariaDB 数据类型与运算符(4)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  5. mysql/mariadb学习记录——创建删除数据库、表的基本命令

    查看已有的数据库: mysql> show databases; +--------------------+ | Database | +--------------------+ | inf ...

  6. 淘宝内部分享:MySQL & MariaDB性能优化 【转】

    MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了解决著名的bug#989,在MySQL 5.1及之前的版本,事务执行过程中并不维护涉及到的所有表的 ...

  7. 淘宝内部分享:MySQL & MariaDB性能优化

    发表于2015-01-20 16:26| 28875次阅读| 来源mysql.taobao.org| 22 条评论| 作者淘宝数据库团队 MySQL性能优化淘宝数据库 摘要:MySQL是目前使用最多的 ...

  8. MySQL/MariaDB数据库的mysqldump工具备份还原实战

    MySQL/MariaDB数据库的mysqldump工具备份还原实战 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.mysqldump概述 1>.逻辑备份工具 mysq ...

  9. MySQL/MariaDB/PerconaDB-提权条件竞争漏洞

    背景 2016年11月01日,国外安全研究员Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/ ...

  10. MySQL数据库3 - MySQL常用数据类型

    一. MySql常用数据类型 数据类型:整数(tinyint smailint int bigint) 定点数 decimal(p,s) ------ 小数点位置固定的       ---> 数 ...

随机推荐

  1. Office开发必备知识----为什么要释放非托管Com资源

    https://www.cnblogs.com/Charltsing/p/RealeaseComObject.html QQ:564955427 目前,国内Office插件开发的风头正盛,很多VBAe ...

  2. 计算机网络基础知识-OSI七层协议模型

    一.物理层 物理层主要规定了物理设备的标准,如网线的类型.光纤的接口类型.各种传输介质的传输速率,物理层的数据以比特流(二进制)的形式存在,传输时将比特流转化为电流强弱,达到目的地之后再转化为比特流. ...

  3. css 通配符选择器

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. Zabbix 3.0的前端默认在Centos 6上不支持

    由于PHP版本的原因,RHEL 6上的Zabbix前端不受支持. 由于Zabbix 3.0的要求是PHP 5.4.0或更高版本,而RHEL 6最新版本是5.3.3. 在大多数情况下,Zabbix服务器 ...

  5. Spring Security 无法登陆,报错:There is no PasswordEncoder mapped for the id “null”

    编写好继承了WebSecurityConfigurerAdapter类的WebSecurityConfig类后,我们需要在configure(AuthenticationManagerBuilder ...

  6. CentOS_7升级系统内核

    最近,在虚拟机中安装docker成功之后,尝试运行docker run hello-world时出现以下错误: $ sudo docker run hello-world Unable to find ...

  7. redis - Sentinel 和 cluster

    redis哨兵集群 引入 上回说到redis主从同步时,master(主库)如果宕机了怎么解决... 我给出了一个手动解决的办法! 但实际上,如果你配置了Sentinel,它能自动发现master宕机 ...

  8. Magento 目录基本介绍

    Magento 目录基本介绍 app; 与Magento 1一样,该文件夹包含主要的Magento代码; adminhtml和 frontend;/ app / design / adminhtml和 ...

  9. 安装 R 包报错 clang: error: unsupported option '-fopenmp' 的解决方法

    MacOS 上安装 R 包 install.packages("data.table") 后面提示是否安装需要编译的版本: Do you want to install from ...

  10. Python之——CentOS 6.5安装Python2.7.14

    Python之——CentOS 6.5安装Python2.7.14   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/l1028386804/art ...