数字
整数
还有其他的数据类型,分成了几种: 1、数字类型 2、字符串类型 3、时间类型 总共可以分成这么几类,咱们的数字里面有个int,除了int还有什么呢,还有tinyint、bigint,它们都是int,它们之间的区别是什么,它是不是能表示的数据范围是不一样的。 比如对于tinyint,它只能表示有符号的-128-127或者是无符号的0-255。 int比它表示的范围更大一点,但是这个条件是是否有符号的,是否有符号怎么做呢,你就是在创建这个类型的时候,比如int unsigned,加上它就表示无符号了,无符号的int表示的是0-4294967295,如果是有符号的,就是int signed,表示有符号的,有符号的范围是-2147483648-2147483647,有负的有正的。 bigint它所指的范围更大一些。 所以在咱们的整数类型里用这几个是不是都表示数字,只不过长短不一样,什么时候用什么,就得看你用这个表存什么数据,如果你存的数据特别少,那你说用int好,还是用tinyint好,tinyint,这得根据咱们的业务或者根据咱们的场景不同来给它做不同的选择。小数
数字类型几个里面还有float、double、decimal,这几个表示小数,但是一旦涉及到float或者double,这表示浮点型,这种东西只能表示不太精准的小数,因为如果你设置成这种类型,它本来就叫浮点型,或者叫双精度类型,它本来就是表示小数的,但是如果一旦你的小数的范围比如说你写上一个0.00000100000123000123001230123,就是你这个数的位数越多,它所表示的越不精准,比如可能你要去插的是这条数据,那真正如果你的类型等于float,那你再插进去,可能就变成0.0000010000012300000000这样了,它是不准确的,所有的,甭管你用c语言,还是用python,但凡涉及到float或者是double类型的,就是设置的是小数,但是是不精准的小数,对于double和float什么区别呢,float是在特别短的位数就开始不精准了,double是你的位数比原来更长的时候就开始不精准了,它们俩就相当于50步笑百步,小数对于那些不太精准的,或者是长度不是特别大的,我们可以选择float跟double,但是如果一旦我们真的要存储很长或者是小数位特别多,或者位数特别多的,用它们就不准确,这玩意以后我们存东西的时候,是不是就是永远不准确了吗难道,用这两个就不准确了。decimal[(m[,d])] [unsigned] [zerofill]
还有一个准确的叫decimal,这个叫十进制小数,但是这个小数永远是精准的,因为decimal内部存储的时候,存储特别长数字的时候,它不是按数字存的,它按字符串存的,就是它的内部底层原理是按字符串存的,而我们去查询的时候感知它的时候还是数字类型的,所以你用小数的时候,推荐你用decimal。 如num decimal(10,5) 它里面可以写2个值: 第一个值10表示总位数,表示小数点前面和小数点后面加起来支持的总位数 后面紧接着还有一个d,它的值是5,这是它小数点后最多可以有几位,这样咱们这个decimal所表示的范围是不是我们给它定了,就是前面5个,后面5个,这是咱们用decimal的时候是这么一个区别。 接下来咱们继续往下,既然有数字这么一类分成整数类和小数类,接下来还有没有其他的呀,还有字符串类。
字符串
字符串类分成几种,叫char、varchar,它们俩都是表示字符串类型,并且它们后面都需要加一个长度,你去使用的时候,它们2个是一样的,它们2个都是用来存字符串,长度是不是都是10个字符,在咱们看来是一样,其实本质上是不一样的。 比如我们用char(10),存上一个root,它只有4个字节,没有占满,如果是char的话,它自己就会在没有占满的位置去给我填充空的东西,比如6个空行,它就会在这帮你去做这样的填充,也就是说我是不是认为写上10,甭管你长度等不等于10,我都占10个位置。 varchar是最多能占10个,如果你存了一个root,它在内存里面,或者在硬盘里面,它存储的时候仅占4个位置,那6个空行是不会增加的。 这2个哪种好? 有同学说varchar好,因为varchar节省空间,但是真正查的时候,它的速度没有char快,为什么呢,各位,你们这样来想。咱们在数据库里面假设是这样的,如果说我规定了红框里这3个位置的长度,以后我去查询的时候。 select name,age from tb1; 它是不是得从前到后帮我去找。找到name是不是就是root这个长度就给它拿回来了,中间这个值如果也给它规定都是char类型,是不是我就知道我跳过几个数据,直接去后面拿就行了。假设我跳过10个位置,把后面的18拿过来,这样的话找到自己root,再跳多少个位置把18找回来,这是char的时候你直接跳过去找了,也知道跳多少,如果是varchar的话,这玩意都没准了。
有的是保存的这个长度,有的是保存的这个长度,你说找到root,你应该往后面跳多少个位置,不知道,所以得往后遍历,一个个找,直到找到说应该跳了,然后再找后面那个。 char速度比较快 varchar能够节省空间 鉴于这一个速度比较快,以后给大家一个sql优化的方向,以后把定长(长度一定的)的数据类型往前放,把变长的往后放。 varchar(10)这个数据是不是变长的,有些占6个位置,有些占4个位置,有些占5个位置。 以后创建数据表时把定长的列往前放
以后假设我做的是它的话,varchar的话我是不是可以把数字放在前面,把定长(年龄)放前面,变长放最后了,相对来说以后咱们找name和age的时候是不是还是找这么一个范围,相对来说会快一些。这是以后sql优化的一个手段。 以后咱们再去创建数据库数据的时候,如果是定长的,就给它规定死了,比如你这里面要让用户填手机号,这手机号的长度能不能规定死了,能,一定要用char,因为char的速度快,并且长度也是定死了的。 如果遇到没法搞的,比如地址,每个人的地址都不一样,所以那时候逼不得已再用varchar,如果真的照这一地步,是不是把varchar放在列的最后面,变长的是不是都放后面。 这2种字符串的长度有限制,char和varchar最高都是255个,如果大于255个字符用text存储,比text大的有mediumtext,比它还大的是longtext,如果比longtext还大的,就不要在数据库存了,就以文件的形式写在你的硬盘上,然后把那个文件的路径放到数据库。大于longtext的数据存到数据库会非常慢,会增加它的压力,影响数据库的读取速度。
上传文件
我要上传文件的话,或者上传图片,这个图片能不能存到数据库里面,能存,但是不要这样做,因为你把文件打开之后,读文件可能是以二进制的形式,mysql还支持二进制的形式,你是不是把你二进制的数据写到数据库,以后以二进制的数据再读回来,读回来你拿到一个文件或者图片,这个图片是不是称为是静态文件,这个图片让用户显示,你是不是还得读出来再给用户,非常麻烦,一般情况下不管你上传图片、文件还是你的视频等等之类的。 你只要给我上传,我会给你写到硬盘上,或者写到某个服务器的硬盘上,就是以文件的形式放在那,放在那就把这个文件的路径,在硬盘上的路径放到数据库,所以如果是上传文件,数据库里不要存文件,存文件所在服务器里的路径,以后想要拿,我把路径给你,你去服务器上只要一访问是不是就可以了,之后咱们在公司,或者是咱们以后做这种文件的时候,一般公司都会有文件服务器,把文件都会放在那一台服务器上,你只要存url就是那个路径就可以了。 文件存硬盘,数据库里存路径时间类型
还有时间类型,这个有几种呢,有date、time、year、datetime、timestamp,它们的区别是存的格式不一样。 date只有年月日,time只有时分秒,看你各种各样的应用场景,year只有年,datetime是年月日时分秒,timestamp也是年月日时分秒,但和datetime格式不一样。 我们最常用的就是datetime,因为咱们存时间都要把年月日时分秒存下来二进制类型
还有二进制类型,如tinyblob、blob、mediumblob、longblob,二进制类型存的时候就是二进制的数据了,这个不常用,知道它就可以了枚举
选项固定,不常修改的用枚举还有2个类型也不常用,但是也得知道,第一个是枚举,比如你现在要往某个表里面插数据,插数据的时候假设是什么呢,就是你要买T恤,T恤是不是就有颜色,颜色我能不能规定了这一类T恤的颜色只有红黄绿行不行,可以,以后工厂生产了一个,我是不是就要在数据库记录一下已经有一件T恤了对不对,然后同学们那个颜色是不是得给它写上,但是这个颜色我们自己可以写,比如写上个红色、黄色、绿色,是不是只能挑这里面的一种放进来,你再弄一件粉色,不行,因为我说过这里面是不是总共有3个,咱们那个T恤是不是只生产3个,3种类型,所以在这各位,我这个列举的不是颜色,而是size是大小,enum里写了5个选项,你写了这5个选项之后,以后用户再来往里面插数据的时候,只能选择这5个里的其中一个。
所以如果我们拿到它,也就是以后再来插入的时候,这个size这一列,size的值只能选择5个当中的一个,所以相当于我们给它规定了一个选项,只能有这么几个,那这一类东西,这种类型选中之后只能拿它其中的一个,这叫枚举。 在python里面没有这个概念,在其他语言里面就是那种基本数据类型里面其实也会有枚举类型,在这你就知道,这叫枚举,有个别名,能理解吗,也就是说你给它写出这么几个,以后就在这么几个里面用就可以了。
有没有什么情况是2个选择合起来用,刚才枚举类型只能拿一个,还有一种特殊的数据类型叫set集合,但是这个集合和python基本数据类型里的集合不太一样,这个集合的意思是当咱们去创建了一张表,这张表里面假设也有一个name,但是这里面还多了一个col这个列,这个列后面写的是set("a","b","c","d"),如果是set,我们接下来能不能往里面给它插入数据呀,可以。
我们要想给它插入数据的时候,这个values第一个红框的值给name,第二个红框的值给set,第二个红框的值也有约束,这个值只能填abcd它们的任意组合,可以插1个或多个
任意组合成一个放进去,能不能出现e,不能,因为我规定好了只能有这么几个 枚举和集合类型知道就可以了,相对来说set用的是非常少,几乎没怎么用过,但是这个枚举是会用到的,这是咱们说的基本数据类型里面大概就有这么几种。 这几种都要背会,要记住 尤其要记住char和varchar的区别,因为以后你去面试的时候你的笔试题里面一定不出意外可能会出现,之前有同学面试的时候出现了,这里面的原理是什么,还有一个写精确的小数用什么来着decimal,可以指定精度,总长度和小数位长度都能指定 标签:10,varchar,是不是,数据类型,char,数据表,MySQL,类型,小数 From: https://www.cnblogs.com/z-x-y/p/17600653.html