宝塔山 发表于 2024-12-19 05:05:39

Linux下学【MySQL】全部常用类型详解( 配实操图 通俗易懂 )

https://img-blog.csdnimg.cn/direct/f64fbc1f8aba4123b41fa76b4c830a55.jpeg#pic_center
逐日鼓励:“当你觉得你会幸运时,幸运就会眷顾你,所以努力吧,只要你把事情做好,并觉得你会幸运,你将会变得幸运且充实。”
    绪论​:
本章继承学习MySQL的知识,本章主要讲到mysql中的全部类型(本篇本来是之前出的,结果写了忘记发了,存到了如今抱歉抱歉~),mysql中的类型大致能分为数值、时间、string、文本和二进制类型,它们下面都另有很多细节,下面我将主要从实操方面带你去领略mysql类型的细节。后续将继承更新mysql的束缚(下)将快速更新,敬请期待!
————————
早关注不迷路,话不多说安全带系好,发车啦(发起电脑观看)。
——————
本章因为大多为插入和创建表,而这些在之前已经讲过,不懂的可以看一下这篇表的必备使用blog,所以代码展示就会较少(因为主要就是在创建表时进行了设置类型,然后观察插入的细节,就不冗余的写代码了)
MySQL数据类型分类

大致如下图:
https://i-blog.csdnimg.cn/direct/a192b28d4fd34aadb00aa28402176b88.png
其中各个类型的范围:
https://i-blog.csdnimg.cn/direct/f95c96870445408a92f534376c59d98d.png
1. tinyint类型


[*] tingyint,只能插入1byte的数据(-128~127)
[*] 当插入凌驾1byte的数据时就会报错:
[*] 还能定位无符号的:tinyind unsigned(此时就是从0~255,留意不是用来扩大数据范围的)
[*] 当插入数据凌驾范围时,MySQL就会直接拦截报错(不像语言将凌驾范围的数据编译器会截断)。也就是说,被乐成插入到mysql中的数据,他们就肯定是合法的!!mysql中,一样平常而言,数据类型本身也是一种束缚。这样就能倒逼程序员,让其尽可能正确的插入
附:
   
[*]束缚:束缚了使用者,表示即使使用者不能很好的使用,mysql也能包管数据的合法性
[*]mysql表中建立属性列:列名称 类型在后(正好和编程反过来)
2. bit类型


[*]bit [ ( M ) ] :位字段类型。M表示每个值的位数,范围从1到64。假如M被忽略,默认为1。
https://i-blog.csdnimg.cn/direct/1ff909a804f946bd98acf444449a0b5a.png
例:假如M = 1 也就是 1个比特位 就只能插入0 1

[*]当插入比特位时,他是按照ASCII码来显示的(而又因为ASCII中0 1是不可视的数据,所以下图看不见)
https://i-blog.csdnimg.cn/direct/5e1ff6de0e0145fc981909fc31b550c4.png
证明如下(前提修改online列属性:bit(10),这样就能存在较大的ASCII码值,当存入可视化的数据就能看的见了,如a):
https://i-blog.csdnimg.cn/direct/451772666fea49cc9633459669ad3a1c.png
[*]位图结构最大是64:当凌驾64后就会报错:
https://i-blog.csdnimg.cn/direct/07f3b8a7d1984ce29b343efd97b26309.png
3. float浮点数类型


[*]float [ ( m , d ) ][ unsigned ]:M指定显示长度,d指定小数位数,共占用空间4个字节。
举例使用:
https://i-blog.csdnimg.cn/direct/a9fbe58497b1460c933a2c1278b24221.png
[*]当 m = 4表示能装的数据、d = 2表示精度的个数(如99.99就是刚刚好符合条件的!)
https://i-blog.csdnimg.cn/direct/f4fc1fee55c4448589c5ac7add9aac27.png
[*]当精度你写的不够时,会给你默认为设置的小数个数(例如m = 4、d = 2时:输入10.0 就会存成 10.00 ,因为m = 4 且 d 会主动补齐,所以输入为 100.0 就不行了,因为小数会补成00,这样就凌驾了4位(也就是:100.00 这是凌驾了4位的))
https://i-blog.csdnimg.cn/direct/a275455a126d4a42832f4c04ce16e685.png
[*]当在小数点超出范围后就会进行将超出范围的小数四舍五入的方式存入(但留意的是当四舍五入后同样是不能凌驾范围的也就是第5点)
https://i-blog.csdnimg.cn/direct/9fea3cc5584045ce8d3fd5d6b7432156.png
[*]但并不表示如何时间都进行四舍五入,当在99.995往后时,凌驾的小数点的值大于便是5时就不能插入了(因为这样四舍五入后就会变成 100.00 就会 凌驾 范围)
https://i-blog.csdnimg.cn/direct/0064da2f5e5a4a54bbd19afe8da0d3ac.png
[*]float也能定义为无符号的,这样就不能插入负数了
https://i-blog.csdnimg.cn/direct/d12a18e5c09e460c90e6022aab5c9aba.png
[*]浮点数中的整数部分也是有精度的,当凌驾肯定值后就会省略
https://i-blog.csdnimg.cn/direct/adf4755e70cc4f6189de94f7bf3da852.png
4. decimal


[*]大部分同float类似,同样能插入小数,而且对于超出范围的小数将会四舍五入(而且对一些特别的也不会插入乐成 99.995),以及会将小数点个数不足的补上0。
https://i-blog.csdnimg.cn/direct/f30aa30c7637479dac94c9fb5030f6e3.png
[*]虽然decimal和float很像,但还是有区别的:
https://i-blog.csdnimg.cn/direct/a21ffa03867c458ebf335c3f4e9f4467.png
[*]decimal不会像float一样去对于一些过大的数据进行处理,也就是它的精度比float更高
[*]float表示的精度大约是7位。
[*]decimal整数最大位数m为65。支持小数最大位数d是30。假如d被省略,默认为0.假如m被省略,默认是10

5. 字符串类型

5.1 char


[*]char(L):固定长度字符串,L是可以存储的长度,单位为字符(字符的概念和语言中不同,他代表的就是一个符号)例:当char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能凌驾2个。
https://i-blog.csdnimg.cn/direct/9cf11dc3cfe041499f5d5295530a1f28.png
再例如:中文同样也是符号个数
https://i-blog.csdnimg.cn/direct/178cac331f6842ba9236924b83bc7256.png
[*]L的最大范围是255
https://i-blog.csdnimg.cn/direct/93f60a5f211441c69737a78838193cbf.png
5.2 varchar变成字符串


[*]varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节 (也就是21845个字符(1字符char = 8字节byte)),同样当有括号时,本质和char很像。
详细如下图(当设置为6字符时,当插入:“中国人,加油!” 时,就有7个字符了,此时就超了所以插不进去)
https://i-blog.csdnimg.cn/direct/5761e64835e14c01bfc2e7419bd7a1df.png
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:


[*]varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记载数据巨细,所以说有效字节数是65532。
[*]当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],假如编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)
详细如下图(当中文类型为utf-8):
https://i-blog.csdnimg.cn/direct/9049744acb4f4dbe93048cc075116a03.png
5.3 比力char和varchar

https://i-blog.csdnimg.cn/direct/f696a1a4ffdd4dbfa3aeb82adc91c18e.png
如何选择定长或变长字符串?


[*]假如数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
[*]假如数据长度有变革,就使用变长(varchar), 比如:名字,地址,但是你要包管最长的能存的进去。

[*]定长的磁盘空间比力浪费,但是效率高。
[*]变长的磁盘空间比力节省,但是效率低。
[*]定长的意义是,直接开发好对应的空间
[*]变长的意义是,在不凌驾自定义范围的环境下,用多少,开发多少
6. 日期和时间类型

常用的日期有如下三个:
1. date:

日期 ‘yyyy-mm-dd’ ,占用三字节
2. datetime:

时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表树模围从 1000 到 9999 ,占用八字节
3. timestamp :

时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和datetime 完全同等,占四字节
三种时间类型类型实操

create table if not exists t11(t1 date,t2 datetime,t3 timestamp);
https://i-blog.csdnimg.cn/direct/4fda845309e640bba77ca0976a507785.png
插入数据:
date: xxxx-xx-xx
datetime:xxxx-xx-xx xx:xx:xx

insert into t11(t1,t2) values('2000-10-01','1949-10-01 08:00:00');
对于时间戳来说不须要本身插入时间,当修改表内的属性时就会主动更改。
https://i-blog.csdnimg.cn/direct/6e508954793e41fba1f2f54dcc42b964.png
可以类似的理解成评论的实现方法:
当你发送评论时就会主动的带上你的时间,而这个时间一样平常就是使用了datestamp类型
https://i-blog.csdnimg.cn/direct/1e365248f02f40dcb3f14a14f4c898ad.png
7. enum(摆列)和set(集合)


[*]enum:摆列," 单选 "类型:enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单位格中,实际只存储了其中一个值。
[*]set:集合,“多选”类型:set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单位格中,设计可存储了其中任意多个值;
例:
有一个调查表votes,须要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]。
其中性别就用enum类型(因为只能单选一个)、爱好就可以用set类型(他是可以多选的)
详细如下:
https://i-blog.csdnimg.cn/direct/f24b49692da74fc1b57ee924881bdded.png
https://i-blog.csdnimg.cn/direct/18c2146aabcd4f718a35a0cae229a06c.png
1. 当enum类型处插入别的其他值时就会报错:

https://i-blog.csdnimg.cn/direct/f679702e93774fe6b19bd999a5dd469f.png
2. 在enum中的类型,可以用下标表示插入数据

他是从1开始的(例如:男女的话下标就分别是1 2)
https://i-blog.csdnimg.cn/direct/3c1f52d7cc19477b87e122a22d360c01.png
https://i-blog.csdnimg.cn/direct/69f0ccf643764e1f8030abb1d7d3748f.png
3. set的插入

使用方法和enum类似,同样不能使用超出范围的数据
不同于enum的是可以同时设置多个参数,而且以逗号区分:
insert into votes values('曹操',1,'乒乓球,足球,游泳');
其中的1 在就enum中表示 男
而set中可以插入多个值
https://i-blog.csdnimg.cn/direct/bf2ddbdac93f4ac0ad04254b08211bdd.png
4. set用数字来插入

但留意的是该数字并不是下标==,这个数字是和元素的个数有关的位图(例如下图set有5中类型,那么它的位图就有5个:00000,留意的是位图的看法和正常的二进制是相反的


[*]例当为1时:10000(代表取出第一个元素)
[*]当为2时:01000(代表取出第二个元素)
[*]当为3时:11000(留意此时是同时取出第一个和第二个元素)
[*]若设置为0下标该值会被设置为空串(留意并不是NULL)
https://i-blog.csdnimg.cn/direct/39a15fd37579439aa22d466bc092d01b.png
   为什么说是相反的因为:
当值为7时:11100(就代表取出前三个元素),正常二进制的7:00111,而此处的7我们反过来看:11100(也就对应着所要元素位置)
https://i-blog.csdnimg.cn/direct/d241012cf84541d0987b316073d3d8cd.png
5. 对enum和set类型的查找和一些细节处理


[*]enum能使用下标和直接查询
https://i-blog.csdnimg.cn/direct/8310665a1c6e46d182d637ce5078f5f7.png
select * from votes where gender=2;//查询votes表中的女
https://i-blog.csdnimg.cn/direct/981226fe04e647ae8096eee98a146074.png
2. set类型能使用下标和直接查询
https://i-blog.csdnimg.cn/direct/038fdd4fff7c4fc4be8e819742f7ac2d.png
但留意的是它不能查找出有多个爱好中包含羽毛球的人(背面增补)

[*]也能直接同时查找出有多个值:
https://i-blog.csdnimg.cn/direct/c41f3e753b7346c0b3a1eadd2ea45934.png
通过上两个案例来看,发现对set类型来说,当在一行数据中的set类型有多个值时,若直接查找其中的某一个值,是无法找到的:
因为select是直接看全部元素的,并不会判定其中是否包含。
处理方法:

[*]首先须要知道:select背面是可以跟函数的
[*]如:find_in_set(作用:在集合中找是否有该元素,若查找到返回下标,反之返回0,详细如下图):
https://i-blog.csdnimg.cn/direct/7634a872d45245639869fc5f2d4b0860.png
那么可以:
在set类型中:如何找到从有多个爱好(set值)中只要包含羽毛球爱好的人就符合条件
那么就可以在select中使用find_in_set函数(用于select的where背面进行判定只要返回非0就表示真了),
详细如下:
https://i-blog.csdnimg.cn/direct/84fb3cbe449045c7b86b9e6bc8834c7b.png
其中若要同时查找多个元素,留意的是,find_in_set并不能同时查找多个元素(因为find_in_set是查找元素),若要实行同时查找可以用 and进行逻辑与使用(or :逻辑或),进行再次的筛选。
找到爱好同时包含:羽毛球和代码的人
详细如下图:
https://i-blog.csdnimg.cn/direct/4f068ae2d37d46509b48f83bf90baf19.png
本章完。预知后事如何,暂听下回分解。
假如有任何问题欢迎讨论哈!
假如觉得这篇文章对你有所帮助的话点点赞吧!
连续更新大量MySQL细致内容,早关注不迷路。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux下学【MySQL】全部常用类型详解( 配实操图 通俗易懂 )