数据类型在哪个位置?
一般都是在定义表的时候,表里面都有字段,每一个字段后面都会有修饰,这个修饰我们可以把它叫做,约束,描述,或者属性都行。在每一个字段后面紧挨着的位置,是定义数据类型的位置。
比如:创建一张表 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把这个字段包起来,它就会把分钟给拿出来。