MySQL 5.7常见数据类型

这篇文章主要介绍了MySQL 5.7数据类型详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Posted in MySQL onJuly 15, 2021

——《深入浅出MySQL(第二版)》笔记

数值类型

整数类型 字节 最小值 最大值
TINYINT 1 有符号 -128;无符号 0 有符号 127;无符号 255
SMALLINT 2 有符号 -2^16;无符号 0 有符号 2^16-1;无符号 2^17-1
MEDIUMINT 3 有符号 -2^24;无符号 0 有符号 2^24-1;无符号 2^25-1
INT\INTEGER 4 有符号 -2^32;无符号 0 有符号 2^32-1;无符号 2^33-1
BIGINT 8 有符号 -2^64;无符号 0 有符号 2^64-1;无符号 2^65-1

浮点类型 字节 最大值 最小值
FLOAT 4    
DOUBLE 8    

定点数类型 字节 描述
DEC(M,D)\DECIMAL(M,D) M+2 最大值取值范围与DOUBLE相同,给定DECIMAL的有效取值范围由M和D决定

位类型 字节 最小值 最大值
BIT(M) 1~8 BIT(1) BIT(8)

整数类型

对于整数类型,MySQL支持在类型名称后面使用(n)的方式指定显示宽度,例如int(5)表示当数值宽度小于5位时,在数字前面填满宽度,如果不显示指定宽度则默认为int(11)。一般配合zerofill使用,就是用'0'填充。

示例:

--创建表t1,有id1和id2两个字段,指定数值宽度分别为int和int(5)
mysql> create table t1 (id1 int,id2 int(5));
mysql> desc t1;

MySQL 5.7常见数据类型

--在id1和id2中都插入数值1
mysql> insert into t1 values (1,1);
mysql> select * from t1;

MySQL 5.7常见数据类型

--分别给id1和id2字段增加zerofill参数
mysql> alter table t1 modify id1 int zerofill;
mysql> alter table t1 modify id2 int(5) zerofill;

MySQL 5.7常见数据类型

设置了宽度限制后,如果插入大于宽度限制的值,不会对插入的数据有任何影响,还是按照类型的书记精度进行保存。这时,宽度格式实际已经没有意义,左边不会再填充任何的“0”字符。

--向表t1的id1中插入1,id2中插入12345678
mysql> insert into t1 values(1,12345678);
mysql> select * from t1;

MySQL 5.7常见数据类型

所有的整数类型都有一个可选属性UNSIGNED(无符号),如果需要在字段里面保存非负数或者需要较大的上限值,可以用此选项。而当一个列指定为zerofill,则MySQL自动为该列添加UNSIGNED属性。

另外,整数类型还有一个独有的AUTO_INCREMENT属性,表示该列的值是自增型。AUTO_INCREMENT值一般从1开始,每行增加1。在插入NULL到一个AUTO_INCREMENT列时,MySQL插入一个比该列当前最大值大1的值。一个表中最多只能有一个列是AUTO_INCREMENT的。

对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为UNIQUE。

浮点类型

对于小数的表示,MySQL分为浮点数和定点数两种。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

浮点数和定点数都可以用类型名称后加"(M,D)"的方式来进行表示,"(M,D)"表示该值一共显示M位,小数有D位。MySQL保存浮点值时对超出位采用的是四舍五入的方式。因此如果在float(5,3)中插入123.006,则保存的值为123.01。float和double在不指定精度时,默认按照实际硬件和操作系统来决定;而decimal不指定时,默认整数位为10,小数位为0。

示例:

--创建表tf,分别将id1,id2,id3字段设置为float(5,2),double(5,2),decimal(5,2)
mysql> create table tf( id1 float(5,2),id2 double(5,2),id3 decimal(5,2));

MySQL 5.7常见数据类型

--向表中三个字段分别插入数据1.23
mysql> insert into tf values(1.23,1.23,1.23);

MySQL 5.7常见数据类型

--向表中分别插入数据1234.005
mysql> insert into tf values(1234.005,1234.005,1234.005);

MySQL 5.7常见数据类型

--向表中分别插入数据123.005
mysql> insert into tf values(123.005,123.005,123.005);

MySQL 5.7常见数据类型

--向表中分别插入数据123.006,123.006,123.004
mysql> insert into tf values(123.006,123.006,123.004);

MySQL 5.7常见数据类型

--去掉表tf字段的精度,并重新插入1.23
mysql> alter table tf modify id1 float;
mysql> alter table tf modify id2 double;
mysql> alter table tf modify id3 decimal;
mysql> insert into tf values(1.23,1.23,1.23);
mysql> desc tf;

MySQL 5.7常见数据类型

MySQL 5.7常见数据类型

--向表中分别插入1.234567123321,1.234567123321123321,1.23234233
mysql> insert into tf values(1.234567123321,1.234567123321123321,1.23234233);

MySQL 5.7常见数据类型

位类型

对于BIT类型,用于存放位字段值,BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写,默认为1位。而直接使用SELECT命令不会看到查询结果,需使用bin()(显示为二进制)函数或者hex()(显示为16进制)函数进行读取。

示例:

--创建表tb,定义字段id1为bit(1),id2字段为bit
mysql> create table tb(id1 bit(1),id2 bit);

MySQL 5.7常见数据类型

--向tb中插入1,1
mysql> insert into tb values(1,1);
mysql> select * from tb;
mysql> select bin(id1),hex(id2) from tb;

MySQL 5.7常见数据类型

数据插入bit两类型字段时,首先转换为二进制,如果位数允许,则成功插入;如果位数超出定义的位数,则插入失败。

MySQL 5.7常见数据类型

时间类型

MySQL中由多种数据类型可以用于日期和时间的表示,下表是MySQL5.0中所有支持的日期和时间类型。

 

日期和时间类型 字节 最小值 最大值
DATE 4 1000-01-01 9999-12-31
DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59
TIMESTAMP 4 19700101080001 2038年某个时刻
TIME 3 -838:59:59 838:59:59
YEAR 1 1901 2155

每种时间类型都有一个有效范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。

数据类型

 

零值表示DATE0000-00-00DATETIME0000-00-00 00:00:00TIMESTAMP00000000000000TIME00:00:00YEAR0000

--创建表tdt
mysql> create table tdt(dt date, dttm datetime, tms timestamp,tm time,yr year);

MySQL 5.7常见数据类型

--使用now()函数向表中插入当前时间
mysql> insert into tdt values(now(),now(),now(),now(),now() );

MySQL 5.7常见数据类型

--向tms中插入NULL,MySQL会自动赋值系统时间
mysql> insert into tdt(tms) values(null);

MySQL 5.7常见数据类型

MySQL只会给表中第一个TIMESTAMP字段赋值系统时间,如果有其他的,则赋值为0值。

--修改表tdt,增加TIMESTAMP类型的tms1列,并给tms,tms1赋值null
mysql> alter table tdt add tms1 timestamp;
mysql> desc tdt;
mysql> insert into tdt(tms,tms1) values(null,null);

MySQL 5.7常见数据类型

TIMESTAMP有一个重要特点,就是和失去相关。当插入提起时,会先转换为本地时区后存放;而从数据库取出时,需要将日期转换为本地时区后显示。

--创建表tdt1,包含字段tms,dt
mysql> create table tdt1(tms timestamp,dt datetime);

MySQL 5.7常见数据类型

--查看当前时区,并向表tdt1中插入系统时间
mysql> show variables like 'time_zone';
mysql> insert into tdt1 values(now(),now());

MySQL 5.7常见数据类型

可以发现,时区的值为SYSTEM,这个值默认是和主机的时区一致的,因为处在中国,这里实际是东八区(+8:00)。

--修改时区为东九区,再次查看tdt1中的时间
mysql> set time_zone='+9:00';

MySQL 5.7常见数据类型

字符串类型

MySQL中提供了多种对字符串数据的存储类型,不同版本有所差异。以5.0为例,MySQL包括了CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET等多种。

 

数据类型 描述即存储
CHAR(M) M为0~255之间的整数
VARCHAR(M) M为0~65535之间的整数,值的长度+1个字节
TINYBLOB 允许长度0~255字节,值的长度+1个字节
BLOB 允许长度0~65535字节,值的长度+2个字节
MEDIUMBLOB 允许长度0~167772150字节,值的长度+3个字节
LONGBLOB 允许长度0~4294967295字节,值的长度+4个字节
TINYTEXT 允许长度0~255字节,值的长度+1个字节
TEXT 允许长度0~65535字节,值的长度+2个字节
MEDIUMTEXT 允许长度0~167772150字节,值的长度+3个字节
LONGTEXT 允许长度0~4294967295字节,值的长度+4个字节
VARBINARY(M) 允许长度0~M个字节的变长字节字符串,值的长度+1个字节
BINARY(M) 允许长度0~M个字节的定长字节字符串

方法

CHAR和VARCHAR

两者很类似,都用来保存MySQL中较短的字符串。二者主要区别在于存储方式的不同:CHAR列的长度固定为创建表时声明的长度;而VARCHAR列中的值为可变长字符串。在检索时,CHAR会删除尾部的空格,而VARCHAR不会。

--创建表tc,包含两个字段ch(char(6))和vc(varchar(6))
mysql> create table tc (ch char(6),vc varchar(6));
--向ch和vc字段插入'abc   '
mysql> insert into tc values('abc   ','abc   ');
--查询字段长度
mysql> select length(ch),length(vc) from tc;

MySQL 5.7常见数据类型

MySQL 5.7常见数据类型

BINARY和VARBINARY

类似于CHAR和VARCHAR,不同的是它们存储的是二进制的字符串。

--创建表tbc,包含字段bc(binary(6))、vbc(varbinary(6))
mysql> create table tbc (bc binary(6),vbc varbinary(6));
--向表中插入数据('a  ','a  ')
mysql> insert into tbc values('a  ','a  ');
--查看字段值长度
mysql> select length(bc),length(vbc) from tbc;

MySQL 5.7常见数据类型

当保存BINARY值时,MySQL通过在值的最后填充0x00(零字节)以达到指定的字段定义长度。

--通过hex()函数查看tbc中数据的保存
mysql> select length(bc),length(vbc) from tbc;

MySQL 5.7常见数据类型

ENUM类型

枚举类型,它的值范围需要在创建表时通过枚举方式显示指定,对1255个成员的枚举,需要1个字节存储;对于25665535个成员,需要2个字节存储。最多允许有65535个成员。

--创建表te,包含字段f1(enum('a','b','c'))
mysql> create table te(f1 enum('a','b','c'));
--向表中插入几条记录
mysql> insert into te values('a'),('B'),('3'),(null);

MySQL 5.7常见数据类型

ENUM是忽略大小写的。还支持使用下标(从1开始,下标越界时报错)的方式插入数据。特殊值'0'表示一个空值。

MySQL 5.7常见数据类型

SET类型

SET和ENUM非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员个数不同,存储也有所不同。

1~8个成员的集合,占1个字节

9~16个成员的集合,占2个字节

17~24个成员的集合,占3个字节

25~32个成员的集合,占4个字节

32~64个成员的集合,占8个字节

而且,SET类型一次可以选择多个成员。

--创建表ts,包含字段f1(set())
mysql> create table ts (f1 set('a','b','c','d'));
mysql> insert into ts values('a,b'),('a,d'),('b,c,d');

MySQL 5.7常见数据类型

--向表中插入数据('a,b,a,c,d,d')
mysql> insert into ts values('a,b,a,c,d,d');

MySQL 5.7常见数据类型

SET类型可以从允许值集合中选择任意个元素进行组合,所以对于输入的值只要在允许值的组合范围内,都可以正确的记录到SET类型的列中。对于超出允许范围的值,报错。而有重复成员的集合,将自动去重。

到此这篇关于MySQL 5.7常见数据类型的文章就介绍到这了,更多相关MySQL数据类型内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
mysq启动失败问题及场景分析
解决mysql的int型主键自增问题
QT连接MYSQL数据库的详细步骤
Jul 07 #MySQL
mysql备份策略的实现(全量备份+增量备份)
mysql定时自动备份数据库的方法步骤
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 #MySQL
MySQL一些常用高级SQL语句
You might like
php预定义常量
2006/12/25 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
Python实现购物系统(示例讲解)
2017/09/13 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
python re模块和正则表达式
2021/03/24 Python
英语国培研修感言
2014/02/13 职场文书
质量月活动策划方案
2014/03/10 职场文书
升国旗仪式主持词
2014/03/19 职场文书
开学典礼演讲稿
2014/05/23 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
高中学生自我评价范文
2014/09/23 职场文书
代领报检证委托书范本
2014/10/11 职场文书
横店影视城导游词
2015/02/06 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫