mysql数据类型实例分析
知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《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
类型的列中。
好了,本文到此结束,带大家了解了《mysql数据类型实例分析》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

- 上一篇
- MySQL数据库如何备份与恢复

- 下一篇
- 特斯拉Dojo超算架构细节首次公开!为自动驾驶「操碎了芯」
-
- 数据库 · MySQL | 4小时前 | 数据类型 扩展性 存储引擎 CREATETABLE 约束条件
- MySQL建表攻略:详解数据表创建方法
- 265浏览 收藏
-
- 数据库 · MySQL | 8小时前 | mysql 字符集 中文乱码 utf8mb4 utf8mb4_unicode_ci
- MySQL中文乱码解决方案与字符集修改命令大全
- 339浏览 收藏
-
- 数据库 · MySQL | 1天前 | 索引 数据类型 字符集 存储引擎 CREATETABLE
- MySQL新建表操作指南与建表技巧
- 462浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 22次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 32次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 36次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 45次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 39次使用
-
- MySQL主从切换的超详细步骤
- 2023-01-01 501浏览
-
- Mysql-普通索引的 change buffer
- 2023-01-25 501浏览
-
- MySQL高级进阶sql语句总结大全
- 2022-12-31 501浏览
-
- Mysql报错:message from server: * is blocked because of many
- 2023-02-24 501浏览
-
- 腾讯云大佬亲码“redis深度笔记”,不讲一句废话,全是精华
- 2023-02-22 501浏览