史上最全的mysql数据类型汇总-(上)

公号运维家 公号运维家     2022-11-29     676

关键词:

史上最全的mysql数据类型汇总-(上)_数据

​mysql​​支持多种数据类型,主要有数值类型、日期/时间类型以及字符串类型。

整数类型

数值型数据类型主要用来存储数字,​​mysql​​提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。

​mysql​​​主要提供的整数类型有​​TINYINT​​​、​​SMALLINT​​​、​​MEDIUMINT​​​、​​INT​​​、​​BIGINT​​​。整数类型的属性字段可以添加​​AUTO_INCREMENT​​自增约束条件。

看下下面两个表;

表一:​​mysql​​中的整数型数据类型

表二、​​mysql​​不同整数类型的取值范围

举个例子:

year int(4);

该声明指明,在​​year​​​字段中的数据一般只显示​​4​​位数字的宽度;

注意点:

显示宽度和数据类型取值范围是无关的。显示宽度只是指明​​mysql​​最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。

例如:向​​year​​​字段插入一个数值​​12345​​​,当使用​​select​​​查询该列值的时候,​​mysql​​​显示的将是完整的带有5位数字的​​12345​​,而不是4位数字的值。

其他整数型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度。

不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。整数类型是不带小数部分的数值,现实生活中很多地方都需要用到带小数的数值。下面我们就来介绍下小数类型。

注意点:

显示宽度只用于显示,并不能限制取值范围和占用空间。

浮点数类型和定点数类型

​mysql​​中使用浮点数和定点数来表示小数。

浮点数类型有两种:

  • 单精度浮点类型(FLOAT)
  • 双精度浮点类型(DOUBLE)

定点数类型只有一种:

  • DECIMAL

浮点数类型和定点数类型都可以用(M,N)来表示。其中呢,我们用​​M​​称为精度,表示总共的位数;​​N​​称为标度,表示小数的位数

​DECIMAL​​​类型不同于​​FLOAT​​​和​​DOUBLE​​​,​​DECIMAL​​​实际是以串存放的,可能的最大取值范围和​​DOUBLRE​​​一样,但是其有效的取值范围由​​M​​​和​​D​​的值来决定。怎么说呢?

如果改变​​M​​​而固定​​D​​​,则其取值范围将随着​​M​​的变大而变大。

那么在mysql中,浮点数类型和定点数类型的取值范围有多大呢?

几乎正常业务情况下是不可能用完的,因为他们的取值范围如下:

​FLOAT​​类型的取值范围:

  • 有符号的取值范围:-3.402823466E+38 ~-1.175494351E-38
  • 无符号的取值范围:0和1.175494351E-38 ~3.402823466E+38

​DOUBLE​​类型的取值范围:

  • 有符号的取值范围:-1.7976931348623157E+308 ~-2.2250738585072014E-308
  • 无符号的取值范围:0和2.2250738585072014E-308~ 1.7976931348623157E+308

注意点:

无论是定点数还是浮点数类型,如果用户指定的精度超出精度范围,则会四舍五入。

可能有点绕,举个栗子吧:

创建一个数据表为​​yunweijia_1​​,字段类型如下;

mysql> create table yunweijia_1 (x float(5,1), y double(5,1), z decimal(5,1));
Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql>

然后我们在这个表中插入一条数据,​​sql​​语句如下:

mysql> insert into yunweijia_1 values (6.66, 7.77, 8.888);
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql>

看上面的提示信息,是不是在我们执行插入语句的时候,给了一个警告信息,然后我们来看下这个警告信息是什么吧;

mysql> show warnings;
+-------+------+----------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------+
| Note | 1265 | Data truncated for column z at row 1 |
+-------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql>

可以看到他提示说,​​z​​​字段在插入的时候被截断了,但是​​x​​​和​​y​​截断就没有提出警告。那么查看下结果吧。

mysql> select * from yunweijia_1;
+------+------+------+
| x | y | z |
+------+------+------+
| 6.7 | 7.8 | 8.9 |
+------+------+------+
1 row in set (0.00 sec)

mysql>

可以看到分别都进行了四舍五入,这点需要注意。

​FLOAT​​和​​DOUBLE​​在不指定精度操作时,默认会按照实际的精度(由计算机硬件和操作系统决定),​​DECIMAL​​若不指定精度则默认为(10,0);

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;他的缺点是会引起精度问题;

注意点:

在​​mysql​​​中,定点数以字符串形式存储,在对精度要求比较高的时候,使用​​DECIMAL​​的类型比较好,另外,两个浮点数进行减法和比较运算时,容易出现问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

日期与时间类型

​mysql​​中有多种表示日期的数据类型,主要有:

  • DATETIME
  • DATE
  • TIMESTAMP
  • TIME
  • YEAR

比如说,当只记录年信息的时候,可以只使用​​YEAR​​​类型,而没有必要使用​​DATE​​。

每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。

YEAR

​year​​​类型是一个单字节类型,用于表示年,在存储时只需要1字节。可以使用各种格式指定​​year​​值,如下:

1、以4位字符串或者4位数字格式表示的​​year​​​,范围为​​1901​​​~​​2155​​​。输入格式为​​yyyy​​或者yyyy,例如:输入‘2022’或者2022,插入到数据库的值均为2022。

2、以2位字符串格式表示的​​year​​​,范围为“00”到“99”。“00”~“69”和“70”~“99”范围的值分别被转换为“2022”~“2069”和“1970”~“1999”范围的​​year​​​值。“0”与“00”的作用相同。插入超过取值范围的值将被转换成​​2000​​。

3、以两位数字表示的​​YEAR​​​,范围为1~99。1~69和70~99范围的值分别被转换为200·~2069和1970~1999范围的​​YEAR​

值。和字符相比较而言,这里的0值,将被转换成0000,而不是2000。

注意点:

两位整数范围与两位字符串范围稍有不同。例如,插入2000年,有人可能会使用数字格式的0表示​​year​​​,实际上,插入数据库的值为0000,而不是所希望的2000。只有使用字符串格式的“0”或者“00”,才可以被正确的解释为2000,。非法​​YEAR​​值将被转换为0000。

举个栗子:

我们创建一个名为​​yunweijia_2​​​的数据表,使用以下​​sql​​语句:

mysql> create table yunweijia_2 (y year);
Query OK, 0 rows affected (0.04 sec)

mysql>

然后我们往表中插入一条数据;

mysql> insert into yunweijia_2 values(2022), (2022);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql>

再次尝试插入一条数据;

mysql> insert into yunweijia_2 values (2166);
ERROR 1264 (22003): Out of range value for column y at row 1
mysql>

我们发现‘2166’超出了​​YEAR​​​类型的取值范围,所以不能插入数据,这个时候我们看下​​mysql​​数据库中的数据;

mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 2022 |
| 2022 |
+------+
2 rows in set (0.00 sec)

mysql>

再举个栗子:

首先我们先删除​​yunweijia_2​​数据表中的数据;

mysql> delete from yunweijia_2;
Query OK, 2 rows affected (0.01 sec)

mysql>

可以看到提示删除了两条数据;

然后我们再插入以下数据;

mysql> insert into yunweijia_2 values (0), (00), (88), (22);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql>

然后看下结果是什么:

mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 2000 |
| 2000 |
| 1988 |
| 2022 |
+------+
4 rows in set (0.00 sec)

mysql>

从上面i看到,字符串‘0’和‘00’的作用相同,分别都转换成了2000年;‘88’转换成了‘1988’;‘22’转换成了‘2022’。

又举个栗子:

老规矩,先删除表中现有的数据;

mysql> delete from yunweijia_2;
Query OK, 4 rows affected (0.01 sec)

mysql>

然后再插入数据:

mysql> insert into yunweijia_2 values (0), (99), (22);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql>

看下结果:

mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 0000 |
| 1999 |
| 2022 |
+------+
3 rows in set (0.00 sec)

mysql>

可以看到,0被转换成了0000,99被转换成了1999,22被转换成了2022。

TIME

​time​​​类型用在只需要时间信息的值,在存储时需要3字节,格式为​​HH:MM:SS​​。

其中,​​HH​​​表示小时,​​MM​​​表示分钟,​​SS​​表示秒。

​mysql​​​中​​time​​​类型的取值范围为-838:59:59~838:59:598,小时部分为什么会这么大呢,这是因为​​time​​类型不仅可以用来表示一天的时间,还可能是某个事件过去的时间或者两个事件之间的时间间隔。

(1)‘D HH:MM:S’格式的字符串,可以使用下面任何一种“非严格”的语法:

  • ‘HH:MM:SS’
  • ‘HH:MM’
  • ‘D HH:MM’

这里的D表示日,可以取0~34的值,在插入数据库时,D被转换成小时保存,格式为“D*24+HH”;

(2)‘HH:MM:SS’格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如:223344被理解成‘22:33:44’,但是‘223366’是不合法的(他有一个没有意义的秒部分),存储时将变成00:00:00。

注意点:

为​​time​​​列分配简写时应该注意,如果没有冒号,​​mysql​​​解释值时,假定最右边的两位表示秒。如果​​time​​值中使用了冒号,则肯定被单做是当天的时间。

例如:

11:22 会被​​mysql​​解释成 00:11:22

11:22会被​​mysql​​解释成11:22:00

举个栗子:

创建一个名为​​yunweijia_3​​的数据表;

mysql> create table yunweijia_3(t time);
Query OK, 0 rows affected (0.03 sec)

mysql>

往这个表中插入数据:

mysql> insert into yunweijia_3 values (10:06:06), (22:22), (2 10:10), (3 00), (20);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql>

看下表中的数据:

mysql> select * from yunweijia_3;
+----------+
| t |
+----------+
| 10:06:06 |
| 22:22:00 |
| 58:10:00 |
| 72:00:00 |
| 00:00:20 |
+----------+
5 rows in set (0.00 sec)

mysql>

小提示:

在使用‘D HH’格式时,小时一定要使用双位数值,如果是小于10的小时数,应在前面加0以用来补全双位数值。

再举个栗子 :

首先我们删除数据表​​yunweijia_3​​里面的数据;

mysql> delete from yunweijia_3;
Query OK, 5 rows affected (0.01 sec)

mysql>

然后再表中插入数据:

mysql> insert into yunweijia_3 values (101112), (111213), (0);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql>

再次向表中插入一条数据;

mysql> insert into yunweijia_3 values (107010);
ERROR 1292 (22007): Incorrect time value: 107010 for column t at row 1
mysql>

可以看到这条数据没有插入成功,我看看下提示信息;

mysql> show warnings;
+-------+------+--------------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------------+
| Error | 1292 | Incorrect time value: 107010 for column t at row 1 |
+-------+------+--------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

为什么这次会插入失败呢,是不是因为我们的分钟应该是小于60的啊,但是这里是70,所以报错了。

我们查看下这个数据库中的数据现在的展示吧:

mysql> select * from yunweijia_3;
+----------+
| t |
+----------+
| 10:11:12 |
| 11:12:13 |
| 00:00:00 |
+----------+
3 rows in set (0.00 sec)

mysql>

又举个栗子:

我们还可以使用系统函数向​​time​​字段列插入值;

删除数据表​​yunweijia_3​​里面的数据;

mysql> delete from yunweijia_3;
Query OK, 3 rows affected (0.01 sec)

mysql>

然后在表中插入数据;

mysql> insert into yunweijia_3 values (CURRENT_TIME), (NOW());
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql>

查看下数据库中的结果;

mysql> select * from yunweijia_3;
+----------+
| t |
+----------+
| 23:03:41 |
| 23:03:41 |
+----------+
2 rows in set (0.00 sec)

mysql>

从结果中可以看到,获取系统当前的日志插入到​​time​​类型的列中。

日期与时间类型还有几种,我们下一篇文章继续写,敬请关注。

 

更多内容请转至VX公众号 “运维家” ,获取最新文章。

------ “运维家”  ------

------ “运维家”  ------

------ “运维家”  ------

linux中断异常,linuxuml建模,linux编译多个源文件,linux怎么更新时间,linux中的分页视频教程,

linux怎么解压gzip,linux解压某个目录,怎么关闭linux网关,linux文件架构图,linux提高权限执行,

linux文件用什么标志,网络安全linux加固,linux中查看邮件,linux修改背景颜色,linux环境下搭建网站。



史上最全的mysql备份方法

 本人曾经用过的备份方式有:mysqldump、mysqlhotcopy、BACKUPTABLE、SELECTINTOOUTFILE,又或者备份二进制日志(binlog),还可以是直接拷贝数据文件和相关的配置文件。MyISAM表是保存成文件的形式,因此相对比较容易备份,上面提到的... 查看详情

可能是史上最全的tensorflow学习资源汇总

 在之前的Tensorflow系列文章中,我们教大家学习了Tensorflow的安装、Tensorflow的语法、基本操作、CNN的一些原理和项目实战等。本篇文章将为大家总结Tensorflow纯干货学习资源,非常适合新手学习,建议大家收藏。想要学习更多... 查看详情

史上最全mysql总结mysql超详细笔记(代码片段)

【史上最全MYSQL总结】MySQL超详细笔记      本文主要介绍了mysql是个啥、他的分类、SQL命令,MySQL的安装注意事项、分类以及在MySQL中常用的命令,包括:数据查询(基本查询、排序查询、条件查询、时间查询、... 查看详情

金九银十,史上最强java面试题整理。

...,会从以下几个方面汇总,本文会长期更新。Java面试篇史上最全Java面试题,带全部答案史上最全69道Spring面试题和答案史上最全Java多线程面试题及答案史上最全50道Redis面试题及答案史上最全 55道MySQL面试题总结i++是线程安... 查看详情

史上最全的大厂mysql面试题在这里!

1、MySQL的复制原理以及流程基本原理流程,3个线程以及之间的关联;主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;从:io线程——在使用startslave之后,负责从master上拉取binlog内容,放进自己的re... 查看详情

史上最全系列|大数据框架知识点汇总(资源分享还不快拿去)

...#xff1a;2、十四大组件安装教程(1)CDH6.2.0视频安装教程(史上最全的安装教程)(2)史上最完整的AirFlow2.1.2版本安装教程(3)2021年Windows下安装GPU版本的Tensorflow和Pytorch(4)Flink1.13.2集群安装部署的3种方式(建议收藏)(5)Flink1.14.0在docke... 查看详情

史上最全的变量作用域和内存问题

(一)JavaScript变量能够用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自下面5种基本数据类型:Undefined、Null、Boolean、Number和String。基本类型值和引用类型值具有下面特点:1.基本类型值在内存中占领固定大... 查看详情

史上最全的变量作用域和内存问题

(一)JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自以下5种基本数据类型:Undefined、Null、Boolean、Number和String。基本类型值和引用类型值具有以下特点:1.基本类型值在内存中占据固定大... 查看详情

史上最全的延迟任务实现方式汇总!附代码(强烈推荐)(代码片段)

这是我的第49篇原创文章。这篇文章的诞生要感谢一位读者,是他让这篇优秀的文章有了和大家见面的机会,重点是优秀文章,哈哈。事情的经过是这样的...不用谢我,送人玫瑰,手有余香。相信接下来的内容一定不会让你失望... 查看详情

史上最全综述|3d目标检测算法汇总!(单目/双目/lidar/多模态/时序/半弱自监督)

史上最全综述|3D目标检测算法汇总!(单目/双目/LiDAR/多模态/时序/半弱自监督)2022-09-0209:06计算机视觉life”,选择“星标”快速获得最新干货本文转载自自动驾驶之心1摘要近年来,自动驾驶因其减轻驾驶员... 查看详情

史上最全综述|3d目标检测算法汇总!(单目/双目/lidar/多模态/时序/半弱自监督)

史上最全综述|3D目标检测算法汇总!(单目/双目/LiDAR/多模态/时序/半弱自监督)2022-09-0209:06计算机视觉life”,选择“星标”快速获得最新干货本文转载自自动驾驶之心1摘要近年来,自动驾驶因其减轻驾驶员... 查看详情

[转]史上最全的mssql复习笔记

阅读目录 1.什么是SQL语句2.使用sql语句创建数据库和表3.创建数据表4.数据完整性约束5.四中基本字符类型说明6.SQL基本语句7.类型转换函数8.日期函数9.数学函数10.字符串函数11.联合结果集union12.CASE函数用法13.IFELSE语法14.WHILE循... 查看详情

史上最全的数据库面试题,不看绝对后悔

数据库面试知识点汇总一、基本概念1.主键、外键、超键、候选键超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键... 查看详情

python知识点(史上最全)(代码片段)

Python期末考试知识点(史上最全)python简介Python是一种解释型语言Python使用缩进对齐组织代码执行,所以没有缩进的代码,都会在载入时自动执行数据类型:整形int无限大浮点型float小数复数complex由实数和虚... 查看详情

史上最全mysql基本操作(这一篇就够用了!!!)(代码片段)

基础知识请移步:数据库、MySQL基本知识欢迎学习交流!!!持续更新中…文章目录MySQL基本操作一、SQL语法规则二、SQL库操作1、创建数据库2、显示数据库3、使用数据库4、修改数据库5、删除数据库三、SQL表(... 查看详情

史上最全redis面试题及答案

1、什么是Redis?2、Redis相比memcached有哪些优势?3、Redis支持哪几种数据类型?4、Redis主要消耗什么物理资源?5、Redis的全称是什么?6、Redis有哪几种数据淘汰策略?7、Redis官方为什么不提供Windows版本?8、一个字符串类型的值能... 查看详情

史上最全的中高级java面试题汇总(代码片段)

原文链接:https://blog.csdn.net/shengqianfeng/article/details/102572691 memcache的分布式原理memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。每个服务器都是完全独立和隔离的服务。memcached的分布... 查看详情

史上最全的中高级java面试题汇总(代码片段)

原文链接:https://blog.csdn.net/shengqianfeng/article/details/102572691 memcache的分布式原理memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。每个服务器都是完全独立和隔离的服务。memcached的分布... 查看详情