MySQL/MariaDB数据类型
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区别:
空间:char(m)定义的列的长度为固定的,m取值可以为0~255之间,当保存char值时,在它们的右边填充空格以达到指定的长度。当检索到char值时,尾部的空格被删除掉。
varchar(m)定义的列的长度为可变长字符串,m取值可以为0~65535之间,(varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
varchar值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。varchar值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。
例:
varchar(10),实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。如果列声明的长度超过255,则使用两个字节。从效率上考虑,用char合适。
对于不同存储引擎有不同的说法:
对于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数据类型的更多相关文章
- 流程控制语句(MySQL/MariaDB )
本文目录:1.BEGIN...END2.true和false3.if结构4.case结构5.loop.leave和iterate6.repeat循环7.while循环 MySQL/MariaDB中的符 ...
- 关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)
数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统——RDBMS: 主要 ...
- MySQL/MariaDB系列文章目录
以下是本系列文章的大纲,此页博文完全原创,花费了作者本人的极大心血,如转载,请务必标明原文链接. 如果觉得文章不错,还请帮忙点下"推荐",各位的支持,能激发和鼓励我更大的写作热情. ...
- MariaDB 数据类型与运算符(4)
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...
- mysql/mariadb学习记录——创建删除数据库、表的基本命令
查看已有的数据库: mysql> show databases; +--------------------+ | Database | +--------------------+ | inf ...
- 淘宝内部分享:MySQL & MariaDB性能优化 【转】
MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了解决著名的bug#989,在MySQL 5.1及之前的版本,事务执行过程中并不维护涉及到的所有表的 ...
- 淘宝内部分享:MySQL & MariaDB性能优化
发表于2015-01-20 16:26| 28875次阅读| 来源mysql.taobao.org| 22 条评论| 作者淘宝数据库团队 MySQL性能优化淘宝数据库 摘要:MySQL是目前使用最多的 ...
- MySQL/MariaDB数据库的mysqldump工具备份还原实战
MySQL/MariaDB数据库的mysqldump工具备份还原实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.mysqldump概述 1>.逻辑备份工具 mysq ...
- MySQL/MariaDB/PerconaDB-提权条件竞争漏洞
背景 2016年11月01日,国外安全研究员Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/ ...
- MySQL数据库3 - MySQL常用数据类型
一. MySql常用数据类型 数据类型:整数(tinyint smailint int bigint) 定点数 decimal(p,s) ------ 小数点位置固定的 ---> 数 ...
随机推荐
- Django中的From和ModelForm
- Linux下C语言生成可执行文件的过程
在当前目录下创建一个C源文件并打开: touch test.c gedit test.c直接编译: gcc test.c -o test 分步骤编译: 1) 预处理 gcc -E test.c ...
- 「LibreOJ NOI Round #1」验题
麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...
- create-react-app中添加less支持
前言 使用 create-react-app 脚手架创建项目后,默认是不支持 less 的.所以我们需要手动添加. 第一步 暴露webpack配置文件 使用 create-react-app 创建的项 ...
- SQL中GROUP BY用法示例(转)
工作中又用到了写SQL 好多年不用了 再拿过来温习下: 不觉豁然开朗 概述 GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Exce ...
- usb的hid鼠标键盘报告描述符(五)
title: usb的hid鼠标键盘报告描述符 tags: linux date: 2018/12/20/ 18:05:08 toc: true --- usb的hid鼠标键盘报告描述符 https: ...
- centos7项目部署
1. 安装nginx 添加CentOS 7 Nginx yum资源库 sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/ng ...
- 如何巧妙的使用ArrayList的Clone方法
一.ArrayList的Clone方法的源码 返回一个Object对象,所以在使用此方法的时候要强制转换. ArrayList的本质是维护了一个Object的数组,所以克隆也是通过数组的复制实现的,属 ...
- MSSQL Server2012备份所有数据库到网络共享盘上面,并自动删除几天前的备份。。
--要备份到哪一服务的IP网络位置,要提前打开文件夹共享.这里还要输入用户名和密码,下面这一行是建立共享 exec master..xp_cmdshell 'net use \\192.168.8.1 ...
- HDU 1049(蠕虫爬井 **)
题意是一只虫子在深度为 n 的井中,每分钟向上爬 u 单位,下一分钟会下滑 d 单位,问几分钟能爬出井. 本人是直接模拟的,这篇博客的分析比较好一些,应当学习这种分析问题的思路:http://www. ...