MySQL之数据类型

MySQL之数据类型

1.分类

MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型

2.数值类型

2.1分类

在这里插入图片描述
在这里插入图片描述

2.2int整数类型

int:整数类型

id int,    #整数类型

2.3double(x,y)小数类型

double:小数类型
分数 – 总分100分, 最多出现一位小数
score double(4,1)

score double(4,1),  #值这个小数总共有4位,小数点后有1位

2.4tinyint

年龄字段 – 不会出现负数, 而且人的年龄不会太大
age tinyint unsigned

2.5decimal

DECIMAL依赖于M(精度)和D(标度)的值
比如: DECIMAL123.45 , 则M=5,D=2

3.字符串类型

3.1分类

在这里插入图片描述

3.2varchar(x)字符串类型

varchar:字符串
注:name varchar(20)是"姓名最大20个字符"
zhangsan是8个字符 ; 张三是2个字符

name varchar(32),  #字符串   姓名最大32个字符

4.日期类型

在这里插入图片描述

4.2date日期类型

date:日期,只包含年月日,yyyy-MM-dd

birthday date,

4.3datetime日期类型(年月日)

datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
如:创建时间 createtime
createtime datetime

4.4timestamp时间戳类型(年月日时分秒)

timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss

insert_time timestamp

5.varchar(x)5.0.3版本前后变化

image-20220207191119571

6.int(10)和char(10)的区别

int(10)中的10表示的是显示数据的长度,不是存储数据的大小;
int(10) 10指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关

而char(10)表示的是存储数据的长度。

最大是255

在这里插入图片描述

第一次实验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二次实验

在这里插入图片描述
在这里插入图片描述

第三次实验

在这里插入图片描述

7.char(x)与varchar(x)的区别

char 与 varchar 都可以描述字符串,但char 和 varchar 类型在存储和检索方面有所不同;
char是定长字符串,char 列长度固定为创建表时声明的长度,长度值范围是 1 到 255,即指定长度多长,就占用多少个字符,和字段值的长度无关 。
当 char 值被存储时,它们被用空格填充到特定长度,检索 char 值时需删除尾随空格.

而varchar是变长字符串,指定的长度为最大占用长度 ,

相对来说,char的性能会更高些,varchar性能较差,原因是varchar在使用的时候,它会根据内容来计算空间;如果确定某个字段的值的长度,可以使用 char,否则应该尽量使用 varchar.例如存储用户 MD5 加密后的密码,则应该使用 char。

比如:char(10)即使我们只存储一个字符,它也会占用10个字符的空间,未占用的其他空间会使用空格及进行补位;

char 是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用 10 个字符,而 varchar 是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.

如:
1). 用户名 username ------> 长度不定, 最长不会超过50
username varchar(50)
2). 性别 gender ---------> 存储值, 不是男,就是女
gender char(1)
3). 手机号 phone --------> 固定长度为11
phone char(11)

8.char(10)在utf8编码下占用多少字节

对于char(10),最大允许存储的字节是30个字节(utf8) 编码 :
即如果存储中文的话,在utf8格式下10个中文占用30个字节,char(10)可以存储10个中文;
那么对于字母类型,在utf8格式下10个字母字符占用10个字节,虽然一个char(10)最大允许存储的字节是30个字节 ,但由于最大限制仍旧是以字符个数来计算的,所以char(10)只可以存储10个字母

在这里插入图片描述

 CREATE TABLE `test_char_1` (
   id int,
   s char(255)
   )ENGINE=InnoDB  DEFAULT CHARSET=utf8;

在这里插入图片描述

在上面是实验中即使是utf-8,也可以指定到255,按道理这样的话不就是700多字节,已经大于255了么?
对此 《innodb存储引擎》一书有下面这段说明:
从MySQL4.1 版本开始 ,char(n) 中的n 指字符长度,不再表示之前版本的字节长度。
在不同字符集下,char类型列的内部存储可能不是定长数据。
也就是说多于对字节字符集编码,char类型不再代表固定长度的字符串。对于多字节字符编码的char数据类型的存储,innodb存储引擎在内部将其视为变长字符类型

9.mysql 中的int(3)、int(10)、int(11)

普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295

其实,INT[(M)] [UNSIGNED] [ZEROFILL] M默认为11
这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。
其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度;
在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的是默认的一个长度,当你不足3位时,会帮你不全,当你超过3位时,就没有任何的影响。
int(M) M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。

Mysql类型关键字后面的括号内指定整数值的显示宽度(例如,INT(3) INT(10) INT(11) )
所以int(10)与int(11)后的括号中的字符表示显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。

10.int(1) 和 int(10) 区别

我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?
id字段为无符号的int(1),我来插入一个最大值看看.
可以看到成功了,说明int后面的数字,不影响int本身支持的大小,int(1)、int(2)…int(10)没什么区别。

CREATE TABLE `user` (
  `id` int(1) unsigned NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
INSERT INTO `user` (`id`) VALUES (4294967295);

在这里插入图片描述
在这里插入图片描述

一般int后面的数字,配合零填充zerofill一起使用才有效。先看个例子:
注意int(4)后面加了个zerofill,我们先来插入5条数据
分别插入1、10、100、1000 、56232 五条数据,然后我们来查询下

CREATE TABLE `user` (
  `id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
INSERT INTO `user` (`id`) VALUES (1),(10),(100),(1000);
 INSERT INTO `user` (`id`) VALUES (56232);

在这里插入图片描述
在这里插入图片描述

总结:int后面的数字不能表示字段的长度,int(num)一般加上zerofill,才有效果。
zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 … 999这种

使用fillzero注意事项:使用fillzero后mysql自动增加UNSIGNED属性 ,即插入的值不能是负数

在这里插入图片描述

11.MySQL 里记录货币用什么字段类型好

NUMERIC 和 DECIMAL 类型被 MySQL 实现为同样的类型,这在 SQL92 标准允许。 他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定;
例如:
salary DECIMAL(9,2) 77
在这个例子中,9(precision)代表将被用于存储值的总的小数位数,而 2(scale)代表将被用于存储小数点后的位数。 因此,在这种情况下,能被存储在 salary 列中的值的范围是从-9999999.99 到 9999999.99

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值