正确使用MySQL类型字段

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 字段类型MySQL的字段类型大致可以分为四种:1、数值类型 2、字符串类型 3、时间类型 4、复合类型数值类型MySQL的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。1bit 位 1字节=8bit 1k=1024字节 1M=1024k类型 大小 范围...

字段类型

MySQL的字段类型大致可以分为四种:1、数值类型 2、字符串类型 3、时间类型 4、复合类型

数值类型

MySQL的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。

1bit 位 1字节=8bit 1k=1024字节 1M=1024k

类型 大小 范围(SIGNED) 范围(UNSIGNED) 用途
tinyint 1字节 (-128,127) (0,255) 小整数值
smallint 2字节 (-32768,32767) (0,65 535) 大整数值
mediumint 3字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
int/integer 4字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
bigint 8字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
float 4字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值
double 8字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值
decimal decimal(M,D),如果M>D则为M+2,否则为D+2,要求M>=D 依赖于M,D的值 依赖于M,D的值 精确数值,会计系统中的货币数据

补充:有符号数与无符号数的区别?

最明显的区别就是二者表示的范围不同: 无符号数中,所有的位都用于直接表示该值的大小。

有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。有符号数高位段0代表正数,1代表负数。

举一个1字节的例子:

有符号:0111 1111 = 2^6+2^5+2^4+2^3+2^2+2^1+2^0 = 127; ==> 范围是 -128 ~ 127
无符号:1111 1111 = 2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0 = 255;==> 范围是 0 ~ 255

有符号数包括负数,无符号数只有整数,在同一数据类型中,内存长度是一样的。同样一个字节大小,有符号和无符号表示的范围不同,但个数相同均为256个。

INT

在 MySQL 中支持的 5 个主要整数类型是 TINYINT,SMALLINT,MEDIUMINT,INT 和 BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。

补充:int(1) 与 int(11) 的区别?

int(1)表示存储1位数?int(11)表示存储11位数?这是错误的!

int(M) 这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。

其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的是默认的一个长度,当你不足3位时,会帮你补全,当你超过3位时,就没有任何的影响。

我们在建表时可以选择是否填充零,以下是Navicat for MySQL建表时可选功能。

FLOAT、DOUBLE 和 DECIMAL

MySQL 支持的三个浮点类型是 FLOAT、DOUBLE 和 DECIMAL 类型。FLOAT 数值类型用于表示单精度浮点数值, DOUBLE 数值类型用于表示双精度浮点数值,DECIMAL 数值类型用于表示定点型数值。MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度。

与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器(必须要带有指示器,要不然会查不到结果,并且宽度指示器和XXint类型的宽度指示器不同,这里是有实际限制宽度的)。

FLOAT(7,3) 规定显示的值不会超过 7 位数字(包括小数位,最大值表示为 9999.999 ),小数点后面带有 3 位数字。对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

DECIMAL(M,D) (M是表示有效数字数的精度。 M范围为1〜65。D是表示小数点后的位数。 D的范围是0~30。MySQL要求D<=M)数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位。和FLOAT一样,对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

DOUBLE 类型和FLOAT类似,对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它。

UNSIGNED 和 ZEROFILL 修饰符也可以被 FLOAT、DOUBLE 和 DECIMAL 数据类型使用。并且效果与 INT 数据类型相同。

在实际开发中我们尽量不要使用FLOAT、DOUBLE,使用DECIMAL 更好!因为FLOAT和DOUBLE求SUM的结果都是不精确的。

字符串类型

MySQL 提供了 10 个基本的字符串类型,可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。

UTF-8:UTF-8一个汉字占用(3)个字节,英文占用(1)个字节。
GBK:GBK一个汉字占用(2)个字节,英文占用(1)个字节。

类型 大小 用途
char 0-255字节 定长字符串
varchar 0-65535字节 变长字符串
tinyblob 0-255字节 不超过255个字符的二进制字符串
blob 0-65535字节 二进制形式的长文本数据
tinytext 0-255字节 短文本字符串
text 0-65535字节 长文本数据
mediumblob 0-16777215字节 二进制形式的中等长度文本数据
mediumtext 0-16777215字节 中等长度文本数据
longblob 0-4294967295字节 二进制形式的极大文本数据
longtext 0-4294967295字节 极大文本数据

在实际开发中,我们建表都是类似 char(20) 那么这括号中的20,是什么意思呢?注意,这里的20表示字符个数。

varchar(20)及char(20)都只能存储20个汉字或者只能存储20个字母或者只能存储汉字和字母的数量达到20的混合字。

时间类型

类型 大小(字节) 范围 格式 用途
date 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
time 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
year 1 1901/2155 YYYY 年份值
datetime 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
timestamp 4 1970-01-01 00:00:00/2038 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

DATE、TIME 和 YEAR 类型

MySQL 用 DATE 和 YEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。

DATETIME 和 TIMESTAMP 类型

除了日期和时间数据类型,MySQL 还支持 DATETIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

DateTime和TimeStamp最大的区别只是用的场景不同,如果你的应用 是用于不同时区(就是国内和国外同时使用),这时候如果用dateTime就会出现各种各样的问题,但是如果使用TimeStamp就不会出现这种时差的问题。

复合类型

MySQL 还支持两种复合数据类型 ENUM 和 SET,它们扩展了 SQL 规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。一个 ENUM 类型只允许从一个集合中取得一个值,类似于单选按钮的功能。例如一个人的性别从集合{'男','女'}中取值,且只能取其中的一个值。;而 SET 类型允许从一个集合中取得任意多个值,类似于复选框的功能。例如一个人的兴趣爱好可以从集合{'听音乐','购物','看电影','打球','打游戏'}中取值,且可以多取多个值。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
28天前
|
关系型数据库 MySQL
mysql增加修改删除字段
mysql增加修改删除字段
14 0
|
1月前
|
关系型数据库 MySQL
Mysql基础第十九天,使用不同类型的链接
Mysql基础第十九天,使用不同类型的链接
25 0
Mysql基础第十九天,使用不同类型的链接
|
2月前
|
关系型数据库 MySQL Docker
MySQL 5.7 timestamp类型设置default value为'0000-00-00 00:00:00'报错的解决方法
MySQL 5.7 timestamp类型设置default value为'0000-00-00 00:00:00'报错的解决方法
|
23天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
3天前
|
存储 数据可视化 关系型数据库
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
本文探讨MySQL中时间类型的选择,阐述datetime、timestamp、整形时间戳等类型特点以及它们在千万级数据量下的查询性能
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
|
7天前
|
SQL 关系型数据库 MySQL
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
17 2
|
11天前
|
关系型数据库 MySQL
MySQL全局库表查询准确定位字段
information_schema.COLUMNS 详细信息查询
201 4
|
18天前
|
SQL 存储 关系型数据库
【mysql】将逗号分割的字段内容转换为多行并group by
【mysql】将逗号分割的字段内容转换为多行并group by
|
30天前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
10 0
|
1月前
|
弹性计算 安全 关系型数据库
rds网络类型选取
云数据库RDS的网络类型选择包括经典网络、专有网络(VPC)、公共网络和私有网络。推荐使用VPC以实现高安全隔离,私有网络增加安全性且节省公网费用。根据业务需求和安全策略选择,如需内部访问选择同一VPC,外部访问则需公网并配以严格安全措施。最新阿里云RDS建议使用VPC并结合安全组、网络ACL和白名单保障安全,通过CEN实现跨地域通信。
17 7