在上一篇博客中,我们简单的了解了MySQL中的常用数据类型以及约束条件,本篇博客我们来对常用的数据类型做一个详细的介绍

这里做个简单的回顾:

MySQL数据类型

MySQL支持多种类型的SQL数据类型:数值,日期和时间类型,字符串(字符和字节)类型,空间类型和 JSON数据类型等
数据类型描述使用以下约定:

  • M表示整数类型的最大显示宽度。M表示整数类型的最大显示宽度。对于浮点和定点类型, M是可以存储的总位数(精度)。对于字符串类型, M是最大长度。允许的最大值M取决于数据类型。
  • D适用于浮点和定点类型,并指示小数点后面的位数。最大可能值为30,但不应大于 M-2。
  • [ ] 表示类型定义的可选部分。

在MySQL中常用数据类型主要分为以下几类

  1. 数值类型
  2. 字符串类型
  3. 日期时间类型

约束条件

约束条件就是在给字段加一些约束,使该字段存储的值更加符合我们的预期。

常用约束条件有以下这些

  • UNSIGNED :无符号,值从0开始,无负数
  • ZEROFILL:零填充,当数据的显示长度不够的时候可以使用前补0的效果填充至指定长度,字段会自动添加UNSIGNED
  • NOT NULL:非空约束,表示该字段的值不能为空
  • DEFAULT:表示如果插入数据时没有给该字段赋值,那么就使用默认值
  • PRIMARY KEY:主键约束,表示唯一标识,不能为空,且一个表只能有一个主键。一般都是用来约束id
  • AUTO_INCREMENT:自增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1
  • UNIQUE KEY:唯一值,表示该字段下的值不能重复,null除外。比如身份证号是一人一号的,一般都会用这个进行约束
  • FOREIGN KEY:外键约束,目的是为了保证数据的完成性和唯一性,以及实现一对一或一对多关系

数值类型

数值类型包括整数型浮点型定点型

整数型(精确值)

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL] 范围非常小的整数,有符号的范围是 -128到127,无符号的范围是0到 255
  • SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 范围较小的整数,有符号的范围是 -32768到32767,无符号的范围是0到 65535
  • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 中等大小的整数,有符号的范围是 -8388608到8388607,无符号的范围是0到 16777215。
  • INT[(M)] [UNSIGNED] [ZEROFILL] 正常大小的整数,有符号的范围是 -2147483648到 2147483647。无符号的范围是 0到4294967295。
  • BIGINT[(M)] [UNSIGNED] [ZEROFILL] 大整数,有符号的范围是 -9223372036854775808到 9223372036854775807,无符号的范围是0到 18446744073709551615。

上面出现了两个词,有符号和无符号。
我们来看看 有符号和无符号(UNSIGNED) 是啥玩意

在计算机中,可以区分正负的类型,称为有符号类型。无正负的类型,称为无符号类型。
简单的理解为就是
有符号值可以表示负数,0以及正数
无符号值只能为0或正数

关于有符号和无符号详解可以看这篇文章或者自己百度百科。

这里我们就不关心原理了,我们只需要知道有符号数可以表示负数,无符号数只能为非负数即可,如果不手动指定UNSIGNED,那么默认就是有符号的

下面我们用一下整数型数据
首先创建一个表

CREATE TABLE int_db(
a TINYINT,
b SMALLINT,
c MIDDLEINT,
d INT,
e BIGINT
);

查看表结构

我们来看看type这一列,可以看到,每个字段类型后面都有一个括号,括号里面的有个数值,这个数值实际上就是字段的显示宽度,也就是M的值,M表示整数类型的最大显示宽度。最大显示宽度为255.显示宽度与类型可包含的值范围无关

我们在创建表的时候并没有指定字段类型的显示宽度,那么,默认的显示宽度则是该字段类型最大的显示宽度

例如字段a的显示宽度为4,是因为TINYINT有符号值的范围是-128到127,
-128的长度为4(负号、1、2、8共四位),所以默认的显示宽度最大为4,其他的以此类推

下面我们再新建一个表,将字段a的修改为无符号类型的。再看看a字段的默认显示宽度

可以看到,默认显宽度就变成3了,因为无符号的TINYINT的值范围为0-255,没有负号,所以最多是3位。

ZEROFILL
下面我们来试试ZEROFILL约束,前面的博客中我们知道。使用该约束后当数据的长度比我们指定的显示宽度小的时候会使用前补0的效果填充至指定长度,字段会自动添加UNSIGNED

下面我们新建个表试一下,这次我们来指定一下显示宽度

CREATE TABLE int_db2(
a TINYINT(8) ZEROFILL,
b TINYINT(5) UNSIGNED);

然后插入一条记录:

INSERT int_db2() VALUES(12,12);


可以看到,12变成了00000012,自动在前面补了0,这是因为指定的显示宽度是8,但是12只有两位,所以在前面补0,使长度为8。这就是ZEROFILL的效果

浮点型

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    一个小的(单精度)浮点数。允许值是-3.402823466E+38 到-1.175494351E-38, 0以及1.175494351E-38 到3.402823466E+38,M是总位数,D是小数点后面的位数。
  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    正常大小(双精度)浮点数。允许值是 -1.7976931348623157E+308到-2.2250738585072014E-308,0以及 2.2250738585072014E-308到 1.7976931348623157E+308。M是总位数,D是小数点后面的位数

下面我们来用一下浮点型
创建表

CREATE TABLE float_db(
a FLOAT(3,2),
b DOUBLE(5,3)
)

我们指定a字段为FLOAT类型,总长度为3,小数点后两位为2,b字段总长度为5,小数点后两位长度为3

插入数据

INSERT float_db VALUES(1.111,2.113);

可以看到,我们给a字段的值是1.111,但是只存进去了1.11
浮点数存在精度丢失的问题,如果涉及到小数运算,尽量不要用浮点型

定点型

  • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
    常用于存储精确的小数,M是总位数,D是小数点后的位数。小数点和(负数) -符号不计入 M。如果 D为0,则值没有小数点或小数部分。最大位数(M)为 65. 最大支持小数(D)为30.如果D省略,则默认值为0.如果M省略,则默认值为10。M的范围是1到65。D范围为0到30,且不得大于M。

我们来用一下DECIMAL类型

首先创建表,先不指定M和D

CREATE TABLE decimal_db(a DECIMAL);

可以看到,默认的总长度(M)为10,小数点位数(D)默认为0.

插入一条数据

INSERT decimal_db VALUES(30.556)

可以看到,存进去的数值被四舍五入阶段了,也就是说,DECIMAL也在存储时存在精度丢失的问题

超出范围和溢出处理

当MySQL将值存储在超出列数据类型允许范围的数值列中时,结果取决于当时生效的SQL模式:
如果启用了严格的SQL模式,则MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败。
如果未启用限制模式,MySQL会将值截断到列数据类型范围的相应端点,并存储结果值,并产生一个警告

在我们的配置文件中可以看到SQL模式的配置,关于SQL模式详情请看SQL模式官方文档


字符串类型

常用的字符串类型有如下

  • CHAR[(M)] 一个固定长度的字符串,在存储时始终用空格填充指定长度。 M表示以字符为单位的列长度。M的范围为0到255.如果M省略,则长度为1,存储时占用M个字节
  • VARCHAR(M)可变长度的字符串,M 表示字符的最大列长度,M的范围是0到65,535,存储时占用**L+1(L<=M,L为实际字符的长度)**个字节
  • TINYTEXT[(M)] 不能有默认值,占用L+1个字节,L<2^8
  • TEXT[(M)] 不能有默认值,占用L+2个字节,L<2^16
  • MEDIUMTEXT[(M)] 不能有默认值,占用L+3个字节,L<2^24
  • LONGTEXT[(M)] 不能有默认值,占用L+4个字节,L<2^32
  • ENUM('value1','value2',...) ENUM是一个字符串对象,其值从允许值列表中选择,它只能有一个值,从值列表中选择,最多可包含65,535个不同的元素
  • SET('value1','value2',...) 字符串对象,该对象可以有零个或多个值,最多可包含64个不同的成员

CHAR和VARCHAR

创建表

CREATE TABLE str_db(
a CHAR(4),
b VARCHAR(4));

插入数据

INSERT str_db() VALUES("","");
INSERT str_db() VALUES("ab","ab");
INSERT str_db() VALUES("abcd","abcd");
INSERT str_db() VALUES("abcdefg","abcdefg");//在严格模式下,该条数据会插入失败,非严格模式则会对数据进行截取

我们看到查询的结果是一样的,但实际上他们存储时占用的长度是不一样的。
CHAR类型不管存储的值的长度是多少,都会占用M个字节,而VARCHAR则占用实际长度+1个字节。

但是CHAR的查询效果要高于VARCHAR,所以说,如果字段的长度能够确定的话,比如手机号,身份证号之类的字段,可以用CHAR类型,像地址,邮箱之类的就用VARCHAR

TEXT系列

TEXT系列的存储范围比VARCHAR要大,当VARCHAR不满足时可以用TEXT系列中的类型。需要注意的是TEXT系列类型的字段不能有默认值,在检索的时候不存在大小写转换,没有CHAR和VARCHAR的效率高

ENUM

枚举类型
创建表

CREATE TABLE enum_db(gender ENUM("男","女"));

插入数据

INSERT enum_db() VALUES("男");
INSERT enum_db() VALUES(1); 也可以使用编号插入值,等同于"男",序号从1开始
INSERT enum_db() VALUES("女");
INSERT enum_db() VALUES(2);等同于"女"

下面我们插入一条不是枚举集合中的数据试一下

可以看到是插入失败的

SET

在ENUM中我们只能从允许值列表中给字段插入一个值,而在SET类型中可以给字段插入多个值

创建表


CREATE TABLE set_db(
a SET('1','2','3','4','5'))

插入数据


INSERT set_db() VALUES('1')
INSERT set_db() VALUES('1,2,3')


日期时间类型

  • TIME 范围是’-838:59:59.000000’ 到’838:59:59.000000’
  • DATE 支持的范围是 '1000-01-01’到 ‘9999-12-31’
  • DATETIME 日期和时间组合。支持的范围是 '1000-01-01 00:00:00.000000’到 ‘9999-12-31 23:59:59.999999’。
  • TIMESTAMP 时间戳。范围是’1970-01-01 00:00:01.000000’UTC到’2038-01-19 03:14:07.999999’UTC。
  • YEAR 范围是 1901到2155

TIME

我们可以看到TIME的存储范围是’-838:59:59’到 ‘838:59:59’,因为TIME类型不仅可以用于表示一天中的时间(,还可以用于表示两个事件之间的经过时间或时间间隔

TIME的完整的显示为 D HH:MM:SS
D:表示天数,当指定该值时,存储时小时会先乘以该值
HH:表示小时
MM:表示分钟
SS:表示秒

创建表:

CREATE TABLE time_db(
a TIME
)

插入值:

INSERT time_db() VALUES('22:14:16');
--   -2表示间隔了2两天
INSERT time_db() VALUES('-2 22:14:16');
-- 有冒号从小时开始
INSERT time_db() VALUES('14:16');
-- 没有冒号且没有天数则数据从秒开始
INSERT time_db() VALUES('30');
-- 有天数也从小时开始
INSERT time_db() VALUES('3 10');
-- 直接使用数字代替也可以
INSERT time_db() VALUES(253621);

DATE

创建表

CREATE TABLE date_db(
a DATE)

插入数据

INSERT date_db() VALUES(20180813);
INSERT date_db() VALUES("2018-06-1");
INSERT date_db() VALUES("2018-4-1");
INSERT date_db() VALUES("2018-04-07");

DATETIME

创建表

CREATE TABLE datetime_db(
a DATETIME
)

插入数据

INSERT datetime_db() VALUES(20180102235432);
INSERT datetime_db() VALUES("2015-04-21 21:14:32");
INSERT datetime_db() VALUES("2015-04-23");

TIMESTAMP

TIMESTAMP和DATETIME使用上差不多,但是范围相对较小。

创建表

CREATE TABLE timestamp_db(
a TIMESTAMP
)

插入数据

INSERT timestamp_db() VALUES(20020121);
INSERT timestamp_db() VALUES(20020121142554);
INSERT timestamp_db() VALUES("2015-12-16 21:14:15");
INSERT timestamp_db() VALUES("2015-12-17");
INSERT timestamp_db() VALUES(NULL);
INSERT timestamp_db() VALUES(CURRENT_TIMESTAMP);
INSERT timestamp_db() VALUES();

YEAR

创建表

CREATE TABLE year_db(
a YEAR
)

插入数据

INSERT year_db() VALUES("1993");
INSERT year_db() VALUES(1993);


MySQL中的常用数据类型大概就这些,我们在建表的时候要选择合适的数据类型定义字段。

下一篇:

MySQL表数据的增删改(DML)


如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

MySQL数据类型详解相关推荐

  1. mysql权限和使用注意事项及mysql 数据类型详解和innodb,myisam区别

    mysql用户权限管理(Grant,Revoke) MySQL可以为不同的用户分配严格的.复杂的权限.这些操作大多都可以用SQL 指令Grant(分配权限)和Revoke(回收权限)来实现. Gran ...

  2. MySQL数据库,从入门到精通:第十二篇——MySQL数据类型详解

    MySQL数据库,从入门到精通:第十二篇--MySQL数据类型详解 第 12 章_MySQL数据类型精讲 1. MySQL中的数据类型 2. 整数类型 2. 1 类型介绍 2. 2 可选属性 2. 2 ...

  3. mysql 1代表true(MySQL数据类型详解)

    [问题简介] MySQL是一种关系型数据库管理系统,其数据类型是数据库设计中的重要组成部分.在MySQL中,1代表true,但是这种数据类型的使用可能会引起一些混淆.本文将介绍MySQL数据类型中1代 ...

  4. mysql 存储xml类型_(MariaDB)MySQL数据类型详解和存储机制

    1.1 数据类型概览 数据类型算是一种字段约束,它限制每个字段能存储什么样的数据.能存储多少数据.能存储的格式等.MySQL/MariaDB大致有5类数据类型,分别是:整形.浮点型.字符串类型.日期时 ...

  5. MySQL数据类型详解:tinyint,smallint,mediumint,int,bigint的区别

    前言 每种编程语言都有自己所定义的数据类型,mysql也不例外,平时我们在创建表时,需要根据业务要求,结合存储.索引.字段临界值等条件来为字段定制不一样的类型.下面我们一起学习下mysql的几种常用的 ...

  6. mysql 数据类型详解_MySQL笔记之数据类型详解

    字符型数据 字符型数据可以使用定长或变长的字符串来实现,其不同点在于固定长度的字符串使用空格向右填充,以保证占用同样的字节数;变长字符串不需要向右填充,并且所有字节数可变. char          ...

  7. MySQL数据库,从入门到精通:第十四篇——MySQL视图详解

    MySQL数据库,从入门到精通:第十四篇--MySQL视图详解 第 14 篇_视图 1. 常见的数据库对象 2. 视图概述 2. 1 为什么使用视图? 2. 2 视图的理解 3. 创建视图 3. 1 ...

  8. MySQL存储过程详解 mysql 存储过程

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  9. mysql存储过程详解[转]

    mysql存储过程详解[转] 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功 ...

  10. 史上最简单MySQL教程详解(进阶篇)之存储过程(一)

    史上最简单MySQL教程详解(进阶篇)之存储过程(一) 史上最简单MySQL教程详解(进阶篇)之存储过程(一) 什么是存储过程 存储过程的作用 如何使用存储过程 创建存储过程 DELIMITER改变分 ...

最新文章

  1. centos7配置bind重启后错误解决
  2. awakeFromNib方法和viewDidLoad方法区别
  3. 线程里面添加参数,并解决多个参数问题[原创]
  4. SQL Server 2014图文安装教程
  5. 笑谈.Net的开发境界
  6. hdu oj1095题解
  7. 【计算广告】不懂这些专业术语别说你懂广告
  8. 集合的体系结构 0119
  9. [二分][贪心]JZOJ P3996 Sabotage
  10. Git:使用 GitHub 托管代码的简单流程
  11. 开发一个简单实用的android紧急求助软件
  12. 《通信原理》复习笔记6----第六章数字基带传输系统(重中之重点+难上加难点)
  13. Windows修改键盘映射
  14. 汽机电调控制器505E运行操作手册
  15. Servlet实现登录带有验证码验证案例
  16. win7计算机不在桌面了,怎么办Win7系统开机后不显示桌面
  17. Python模拟QQ群发邮件
  18. python大作业黑白棋_计算概论大作业——黑白棋AI设计
  19. X86服务器CPU的作用,为什么需要基于x86架构的至强处理器?
  20. 语雀(专业的云端知识库)

热门文章

  1. 【NLP】学不会打我 半小时学会基本操作 13 孪生网络
  2. R语言入门mac——RStudio安装➕R包安装【附安装链接】
  3. 几何画板椭圆九种画法_几何画板怎么制作椭圆定义演示动画?
  4. ZK 数据传输三:在页面使用SpringUtil获取spring层类再获取数据(jsp页面或zul页面)...
  5. html 链接 vf,vfp 超链接
  6. Vs2015常见错误码:error LNK2019: 无法解析的外部符号;error C2011:类型重定义;
  7. 云WAF之语义分析引擎
  8. 涂抹oracle源代码,涂抹Oracle:三思笔记之一步一步学ORACLE
  9. poi导出excel 并实现合并单元格
  10. pclint html报告,PC-lint 9 + 中文手册