Mysql数据类型

数据类型在哪个位置?

一般都是在定义表的时候,表里面都有字段,每一个字段后面都会有修饰,这个修饰我们可以把它叫做,约束,描述,或者属性都行。在每一个字段后面紧挨着的位置,是定义数据类型的位置。

比如:创建一张表   create table t1(id int)         

id字段,在id字段紧挨着的地方,一般定义它的数据类型。

为什么把它又叫做约束?

一旦把它定义成整型之后,写字符串就写不进去了。给它插入字符串类型的插入不进去。一旦定义成字符串类型,插入数字类型的数据就插入不进去了。所以把它称为约束。

数据类型有什么用?

可以节省系统资源。

create table t1(id int)  比如;这里定义了int,到时候在使用这个字段数据的时候,就不用事先判断它是什么样的数据类型了,这样我的cpu就少干了一件事。

比如;让输入手机号,它把手机号输成20位,很明显不合理,系统拿到东西之后,还得判断长度对不对,不如刚开始让输入手机号的时候就给定死,只能输入11位,多一位少一位就不让写进去。这样我对数据库里的数据就少了很多判断的东西。我的cpu,内存都会少干很多事。这就是数据类型存在的意义。

常见的数据类型

数值类型:

整数类型   tinyint smallint mediumint int bigint

浮点数类型 FLOAT DOUBLE

定点数类型 DEC

位类型 BIT

字符串类型:

时间和日期类型:

数据类型的大分类,要记住。每个大分类常见的类型记住。

比如;数值类型的整型常用必须得记,整型里面的int也常用,得记住。

数值类型:需要记得是类型是怎么定义的,它是有大小范围的,不能随意插入数据,即使是浮点型,double类型也不行,平时用的比较多的是int类型,int类型后面的数字它决定不了输入数值的大小,决定大小的是类型本身

整数类型

分类:tinyint smallint mediumint int bigint

一共五种,这五种数据类型,就决定了这个字段里面能存储数据的最大值,首先它是一个整数,有带符号的,无符号的。这五种类型不同地方是存储的最大数,最小数它的范围是不一样的。

有符号 :有正负数

无符号 :没有负数 类型后面使用unsigned和zerofill修饰符

tinyint

创建一个t1的表,t1里面只有id,用tinyint

 tinyint是数据类型,可以把它翻译成微小,数字10代表的不是输入数字的长度,在整型里面这个数字不太重要,在字符串类型里面这个数字特别重要,因为它决定不了输入数值的大小,决定大小的是类型本身。它是显示宽度,平时看不出来,想让他把显示宽度显示出来的时候,它的结果是在前面补0,没什么太大意义。

插入一条数据,会发现258进不去,它输入进去了,没有报错,它给你改了,有个warning

Query OK 查询ok,其实每次操作这个表它都是一个查询,都会查询一下表。

1 row affected   一行受影响了   

 超出了id的字段 (tinyint)范围,

 这种命令,只有在上一条命令有warning的时候才生效。

 前面没有warning的时候不会生效。

插入一个负数

 

 tinyint类型的范围 -128--------127

公式是select power(2,7)          2的7次方-1   

 为什么是2的多少次方?

  是因为tinyint在内存里面最多占8bit。一个bit称它为一位,在bit的计算里面只有0和1,tinyint一共有8bit,也就是它最大的值也就是8个1,但是得看看它是有符号的还是无符号的。如果是有符号的前面那一位也不是符号位,01111111,这是一个二进制的数,如果换成十进制最大就是127,如果是无符号的就是2的8次方。

存储数据大小范围公式

1个字节Byte 2个字节 3个字节 4个字节 8个字节

8bit                 16           24         32         64

无符号:范围运算公式 0到2^n-1

比如:

tinyint:0到255

bigint: 0到2^64-1

有符号:范围运算公式 -2^(n-1)到2^(n-1)-1

比如:

tinyint:-128到127

smallint

创建一个t2的表,t2里面只有id,用smallint

 在t2里面输入一个非常大的值,不管输多大,它总是会有范围的,这个值它是接受不了的,select * from t2;就可以判断它能输入的最大值。在输入一个负值。

 smallint类型的范围 -32768----32767

定义无符号整型:

没有负数 类型后面使用unsigned和zerofill修饰符

方法一

unsigned:

mysql> create table t6(id bigint(2) unsigned); 在类型后面加修饰符unsigned

方法二

zerofill:

mysql> create table t2 (

-> id1 int zerofill,

-> id2 int(6) zerofill

-> );

 加一个zerofill用0填充,只有用0填充的时候才能感受到tinyint后面数字10的存在,平时没什么作用。不做开发更没用。

浮点数类型

单精度(float),双精度(double)

单精度和双精度的区别?

单精度支持的数值范围比较小,双精度支持的数值范围会大一点。

想用浮点数,平时用float就够了。

什么时候用浮点数?

里边所有的数据都要带小数点,不带小数点的整数都进不去。浮点数的适用范围没有整型的大

float(5,3) 5宽度 3精度   小括号里的数字定义的是宽度和精度,宽度就是你输入的整个数据一共有多少位,精度是小数点后面的位数。

6是整个数值的宽度,2是小数点后面最多是两位。

定点数类型

有整数有小数的数据类型,和浮点型的区别在于它存储数据的时候是不一样的存储形式,它在内存里边存储数据是以字符串的形式存储的。比浮点数更精确,适合用来表示货币等精度高的数据。

如果数据库里边存的是钱,最好的数据类型就是定点型的。

真正定义数据类型的是开发的架构师,是在定义表结构,字段的时候定义的。

位类型

指往里边存储数据的时候,只能存0101,类型是bit。

BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位

对于位字段可以使用函数读取:

bin()显示为二进制

hex()显示为十六进制

mysql> create table test_bit (id bit(4)); //4bit能存储的最大值为15

mysql> desc test_bit;

字符串类型:

作用:用于存储用户的姓名、爱好、发布的文章等

字符类型 char varchar

char

创建一个t7表,名字都是用字符串类型    char类型   5就是能输入字符串的最大长度 ,在这里是有用的。

字符串要用引号引起来abcdefg七位,他会把超出的右边的那些字符给干掉。

 varchar

后面的数字同样的效果,看起来结果是一样的

 char varchar区别:

都是存储字符串类型的,char类型占用的是固定的长度

 比如现在是占5位,五个字符的长度,现在往里面输入两位的字符,它占的内存大小同样还是五位。但实际上是在浪费空间,用不上还要给你分配空间。

varchar  后面的宽度指定的是计算机能给与最大的宽度,实际宽度是字符串的长度。 

虽然设置了五个字符的宽度,实际上它是承诺可以给你最大五位宽度的内存,如果占不了那么多,就给它砍掉了。

char长度范围 0~255 

varchar长度范围 0~65535

二进制类型 BINARY和VARBINARY

所谓二进制类型就是里边只能存0和1

VARBINARY有点像varchar,占多少给多少

文本类型 BLOB和TEXT

专门用来存文本的,能用varchar就不用text,长度不够的时候再使用text,都是存文本建议用varchar,因为text本身支持的长度非常大,最大长度为4294967295(2^32-1)个字节或字符。

如果varchar存储的实在是太长,放不下了再用text,在实际生产环境中,如果数据库绝大部分存储的是文本,我们就不用mysql了,会用专门存储文本的数据库。比如Mongodb,适合于存小说,存文章。mysql数据库存章节,书名,书的属性,如果存书的内容就不合适了,如果真想存储书的内容,就用文档类型的数据库。

1.经常变化的字段用varchar

2.知道固定长度的用char

3.尽量用varchar

4.超过255字符的只能用varchar或者text

5.能用varchar的地方不用text

枚举类型 enum

和set类型有点像,指定一下你可以在字段里面输入的数据的范围

mysql> create table t101(name enum('kk','rr'));

只能从kk,rr两个里面2选其1,就像系统表里有这样的东西。

比如user表,里面的值要么是N要么就是Y。因为它在定义表结构的时候,定义的数据类型就是enum类型的。

 看它的表结构

 

 里面的值要么是N要么就是Y,输入第三个值就报错了。

创建一个t10表,它也是属于字符串类型的一种,abc,def。让它等于hello,进去之后发现是空的

只能是abc或者def

 

集合类型 set

集合类型和上面的枚举类型非常像。set类型可以同时插入多个数值,但是多个数值也只能来源于这个范围之内。enum只能是其中之一。在设置的时候可以用逗号隔开,多个内容插进去。

mysql> create table  t11(name set('gg','dd'));

mysql> insert into t11 set name="dd,gg";  

 也可以插入其中一个

 如果除了abc,def还想插入hello,就不行了

 

 时间和日期类型:

作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等

用了数据类型之后,里面插入的数据只能是时间,不能是别的,就算是插入的不是时间,它也会变成时间。

日期:例如 

2022年3月8日

2022/03/08

2022-03-08

把这个日期2022/03/08插入进去。

然后再插入20220308,它会自动的变成日期。

 

前提是它不能乱写,必须得按它的位数来

 

 前面不写20,也行,

 但是写78,会发现他不是20而是1978.它不是最近的。

 

 70年之后全部都是19,70年之前都是20,20,19这是世纪会自动补全,后面70才是年。

19700309

时间和日期类型测试:year、date、time、datetime、timestamp

year是年  一般指的都是70     19这是世纪会自动补全  分界线:0-69   70-99

time 是小时分钟秒

datetime 是日期+时间(哪年哪月哪日几点几分几秒)

timestamp  想获取当前的时间一般会把数据的数据类型设置成timestamp,因为这个时间你不给他赋值默认用的就是当前时间。

mysql> insert into test_time values(now(),now(),now());    

now() year() month() day() minute() hour() second()

now函数是使用当前时间   

2018-01-11 10:59:57   就是一个字段里面有这么一个数据,我可以用函数可以把这一列给包起来,假如这一列的名字叫abc,abc这一列存的数据长2018-01-11 10:59:57这样。如果用year函数去给它处理一下,它就会把这个里面的年2018给拿出来,如果拿minute把这个字段包起来,它就会把分钟给拿出来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你是我的导航

谢谢您的打赏,您的鼓励。

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

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

打赏作者

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

抵扣说明:

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

余额充值