【MySQL】数据库数据类型
1. 整体概要https://i-blog.csdnimg.cn/blog_migrate/9ed41923a4e03da49122421a9289e44e.png 看起来分为很多类型,例如数值类型,有一些看一眼就懂啦,以是不会全部先容
2. 数值类型
https://i-blog.csdnimg.cn/blog_migrate/f48c1c07fc781c6809f32563fcfb33bc.png (有符号) tinyint 创建表
https://i-blog.csdnimg.cn/blog_migrate/fc1a8c610be26c4a09d176810551e08b.png 进入 test_db数据库中,并创建表t1 ,其内部包含 tinyint类型的num
https://i-blog.csdnimg.cn/blog_migrate/bfb990eab026a7de1dd14e57316bf280.png 输入 desc t1; 查看t1表结构
tinyint类型为一个字节,有符号,以是取值范围为 -128 到 127
https://i-blog.csdnimg.cn/blog_migrate/c45a42d1e7fbceca1250098591bd4c0a.png 向t1 表中分别插入 -128 、128 、1
https://i-blog.csdnimg.cn/blog_migrate/6bf350dda4f9a6132b7fb536c2d7de30.png 输入 select * from t1; 查询 t1 表的结构
https://i-blog.csdnimg.cn/blog_migrate/3d83071f409895096de07f59db728c61.png 由于 -129 和128 超过了 tinyint类型的取值范围,以是插入失败
(无符号) tinyint 创建表
https://i-blog.csdnimg.cn/blog_migrate/73e72b831186e1bd3cd584418c64c764.png 再次创建表,内部包含一个无符号的 tinyint类型的num
以是取值范围为 0 到255
https://i-blog.csdnimg.cn/blog_migrate/aa0a6d8d900245b2c4c751ef69bb6b19.png 输入 desc t2; 查询t2表的结构
https://i-blog.csdnimg.cn/blog_migrate/7d99d9084fc1b40301dafae84f2fbc93.png 由于取值范围是 0 到255
以是向t2表插入 0 100 255 ,可以插入乐成
而向t2表插入 -1,则会插入失败
bit类型
bit :位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默以为1
https://i-blog.csdnimg.cn/blog_migrate/54be059c6ad91698fb1923d8ed6389d9.png 先进入 test_db 数据库中,创建一张 t3表
内部包含 int类型的id 、 1字节的online
id 表示 用户某一个身份id
online 表示 当前用户是否登录 (1表示登录 0表示没有登录)
https://i-blog.csdnimg.cn/blog_migrate/7edeb3e58cebfdd891bd42f515be3a85.png 插入 (123 ,0 ) 表示123号用户不在线
插入 (124 ,1 ) 表示 124号用户在线
可当插入 (123,5)时 ,由于 online 的类型为1个比特位,以是只能插入0大概1,以是会报错
https://i-blog.csdnimg.cn/blog_migrate/9516aea4a4d0786d794fb74b048e2444.png 输入 select * from t3; 即查看t3表的结构
发现online 对应的位置 什么都看不到
是因为通常以ASCII值形式体现的,而ASCII值在当前是不可体现的
https://i-blog.csdnimg.cn/blog_migrate/855fce42dfb87c05da546352adc31ce5.png 让 online 以十进制方案体现出来
如许就可以看到 0 大概 1
https://i-blog.csdnimg.cn/blog_migrate/ba5a5975d519dfc959923070c209bf6d.png 创建表时,bit范围是1到64,而当前设置是65,以是创建表不乐成 会报错
float 类型
float [ (m,d) ] : m指定体现长度(数字位数的总个数) d指定小数位数 占用空间4个字节
https://i-blog.csdnimg.cn/blog_migrate/ebf060ad8ca0ddd974d989cb78e578a7.png 创建一张表t5,包含 int类型的id 以及 float类型的salary,并且salary共有4位,其中2位是小数
id 表示 这个人的身份
salary 表示 这个人的工资
float [ (4,2) ] 的取值范围是 -99.99 和 99.99
https://i-blog.csdnimg.cn/blog_migrate/418a5ce2751e19a1466f969a39aee9b6.png 向t5表插入 (1,99.99) 和(1,-99.99) ,是可以插入乐成的
(float的取值范围是有符号区分的)
https://i-blog.csdnimg.cn/blog_migrate/6b31b8b94e16a104bc4d32579d13a50e.png 若slary为23.46,则插入乐成,并且体现为23.46
https://i-blog.csdnimg.cn/blog_migrate/39973c268abbdc79a087d71f08768508.png 若slary为23.467,则插入乐成,并且体现为23.47 ,因为四舍五入,将其进位
https://i-blog.csdnimg.cn/blog_migrate/eb07c550ba1adf26a2a9945e523529ca.png 若slary为23.464,则插入乐成,并且体现为23.46,因为四舍五入,将其舍去
以是进行浮点数存储时,若要求是2位精度,而传入更多位的精度,mysql就会采用 四舍五入的方式 将数据进行存储
(无符号)float
mysql支持定义符号的浮点数
https://i-blog.csdnimg.cn/blog_migrate/088c0cfe5a2b8fd2d10257255b8fae58.png float [ (4,2) ] 的取值范围为 0 到 99.99
创建一张表t6,内部包含 一个bigint类型的id 以及 无符号的浮点数类型的salary,并且salary共有4位,其中2位是小数
https://i-blog.csdnimg.cn/blog_migrate/03f67d0d4ae21c5a168f7c0f0bf8d963.png 若插入 一个99.999,正常来说小数末了是9 是要四舍五入的,但是进位 就会超过99.99的取值范围 ,以是会报错
decimal
decimal (m,d) : 定点数m指定长度 ,d表示小数点的位数
decimal(5,2) 的取值范围是 -999.99 - 999.99
decimal(5,2)unsigned的取值范围是 0 - 999.99
decimal和float很像,但是有区别:
float 和 decimal 表示的精度不一样
https://i-blog.csdnimg.cn/blog_migrate/2832ae4e1ab37ceb142d83f9934690c6.png 创建一张表 t7 ,内部包含 float类型的f1,f1总长度为10 ,其中小数部分为8
以及decimal 类型的f2,f2总长度为4,其中小数部分为2
https://i-blog.csdnimg.cn/blog_migrate/d22f1dfdda32efc9727d1240a579f5b7.png 当插入 99.99 在decimal的取值范围内时,则插入乐成
当插入99.999不在decimal的取值范围内时,则插入失败
https://i-blog.csdnimg.cn/blog_migrate/b194dd9cc07a1222237142047bcfaadf.png 将属于t7表的 decimal类型的f2 的精度 改为 总长度为10 ,其中小数部分为8
https://i-blog.csdnimg.cn/blog_migrate/0fcad560738e9d9879c798599ce053be.png 在t7表中的成员 f1和f2中分别插入 23.12345612
输入 select *from t7; 查看t7表的信息 发现 f1是精度方面的题目
float在精度过大时,会进行优化策略
但decimal不会如许,decimal可以完全保证数据的精度
3. 二进制类型
char类型
char(L) : 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值为255
https://i-blog.csdnimg.cn/blog_migrate/a70bc9be618f8f0b0612f1160b38a7d9.png 在test_db数据库中,创建一张表t8 ,内部包含 int类型的id 以及 char类型的name
https://i-blog.csdnimg.cn/blog_migrate/bbda13af575d55859fa198b527987d4f.png 输入 desc t8; 查看t8表中更详细信息
t8表中的name 最多储存2个字符
https://i-blog.csdnimg.cn/blog_migrate/4600953e3ffeddfbc7e3089c9c3bccb1.png 向t8表中插入 一个字符’a’ 大概插入两个字符’ab’ 时,就可以插入乐成
向t8表中插入三个字符’abc’时,就会报错
MySQL中的字符代表一种符号,一个汉字代表一个字符
https://i-blog.csdnimg.cn/blog_migrate/84d32af53e2328d38712305f08118df6.png 当插入1个字符 中 和2个字符 中国 时,是可以插入乐成的
但当插入 3个字符 中国人时 ,因为最多储存2个字符,以是会报错
varchar类型
varchar(L) :可变长度字符串,L表示字符串长度,最大长度为65535个字节
https://i-blog.csdnimg.cn/blog_migrate/bd8ce61fd1edbc71c34ef7ca3b2ba674.png 创建一张表t9,内部包含int类型的id 和 varchar类型的name,最多储存6个字符
并默认字符集为uft8
https://i-blog.csdnimg.cn/blog_migrate/945c88f4ec684d1542131c961b4b36d5.png 每一个汉字都可以看做是一个字符
若输入 1个字符 中, 3个字符中国人 都可以插入乐成
若输入 7个字符时,就会报错
https://i-blog.csdnimg.cn/blog_migrate/a98ecd68326cd031470ac77b757f6fa6.png 想要修改 t9表中的name成员的varchar类型 最多储存65536个字符
但是报错体现 最多 为21845 个字符 ,可明明varchar 最大长度为65535个字节
MysQL在存储varchar类型时,是按照utf8编码的
在uft8编码中,一个英文字符即是1个字节,一个中文即是3个字节
假设以中文盘算,21845个字符 乘以3 就为 65535 个字节
char为固定长度字符串,雷同于c++中的数组
如:char(6) 就表示数组字符个数为6个字符,大概只用了1个字符空间,但是依旧会给6个字符空间
varchar为变长字符串
varchar(len) len定义多大就表示字符空间的上限
如:varchar(6) 大概只用了1个字符空间,就只会分配保存一个字符空间
varchar的字节长度在0 -65535之间 ,需要有1-3个字节用于记录数据的大小
(传入数据的大小不同,有大概数据小 1个字节就能记录,有大概数据太大,就需要3个字节才能记录)
假设有3个字节记录数据,以是有用字节数为65532
当表的编码为utf8时,varchar(len) 的参数 len最大值为 65532/3=218844
(一个字符占用3个字节为例)
以是最大字符个数为 21844
https://i-blog.csdnimg.cn/blog_migrate/88d64be63c88513d2a754adf1d3d7b8e.png 创建一张表t10,内部包含 varchar类型的name ,其最多储存21845个字符
因为超过了21844范围,以是会报错
https://i-blog.csdnimg.cn/blog_migrate/c0a3b34132cf2c62947ae00d1b8ea606.png 当表中 name的varchar类型的取值为21844时,就可以创建乐成
4. 日期时间
日期时间类型
常用的日期如下:
date:日期 ‘yyy-mm-dd’ (年月日),占用三个字节
datetime: 时间日期格式 ‘yyyy-mm-dd HH: ii:ss’ (年 日 时 分 秒) 表示范围从1000到9999,占用八个字节
timestamp:时间戳 ,从1970年开始的 yyy-mm-dd HH:ii:ss (年 月 日 时 分 秒) 格式和 datetime 完全一致,占用四个字节
https://i-blog.csdnimg.cn/blog_migrate/79b3f8fe53e95caf469f396b1859d24d.png 创建一张表 t10 ,内部包含 date类型的t1 ,datetime类型的t2,timestamp类型的 t3
https://i-blog.csdnimg.cn/blog_migrate/bf87389fcbd34fa2bc7a59cf039055e9.png 输入 desc t10; 查看t10表的更多详细信息
t3的类型为时间戳,默认值为 CURRENT_TIMESTAMP
扩展说明:创建表结构时,向表中插入数据,timestamp会主动更新
而date与datetime 需要外部插入
https://i-blog.csdnimg.cn/blog_migrate/91ee4cd4a07f1d500c655c97c6a57407.png 向t10表中的成员 date类型的t1 和 datetime类型的t2 分别插入 2001-10-02 和2002-10-03 08:00:00
输入 select * from t10; 查看t10表的更详细的信息
发现t3主动更新为当前时间
https://i-blog.csdnimg.cn/blog_migrate/9350e90f9f07deb1043dd2413014cfae.png 当输入 update t10 set t1=‘2003-10-04’; 更新t10表中t1的时间
发现t3所表示的时间戳 也会跟着厘革
5. string 类型
enum类型和set类型
enum:罗列
enum(‘选项1’,‘选项2’,‘选项3’);
提供若干个选项的值,终极一个单元格中,现实只存储其中一个值
如:问卷调查 性别 只能选男大概女
set :集合
set(‘选项1’,‘选项2’,‘选项3’);
提供若干个选项的值,终极一个单元格中,可存储任意多个值
如:问卷调查 爱好 可以选打羽毛球 乒乓球 篮球等
https://i-blog.csdnimg.cn/blog_migrate/c35041ec3261a7c5642779ede0fd70ae.png 创建一张表 votes,其中包含 最多存储30字节的名字 、 性别 、 爱好
同时 性别 只能从男大概女中 选择一个
而爱好 可以从 代码 篮球 游泳中 选择一个大概多个
https://i-blog.csdnimg.cn/blog_migrate/6e076bf9b315da485b1c47863de10296.png 向votes表中插入 姓名为 张三 性别为 男 爱 好为代码
https://i-blog.csdnimg.cn/blog_migrate/a549631f237e8566a8084b84a9124abc.png 当性别中 插入 0 和3 是不可以的,可插入 1 和 2 是可以的
https://i-blog.csdnimg.cn/blog_migrate/68ee94abb37925770e1d946cdd48f743.png 输入 select * from votes 时,发现 1对应性别男 2对应性别女
以是利用罗列类型,可以利用对应的罗列常量
也可以利用罗列常量对应的下标 (从1开始 分别代表第一个罗列值 依次今后推)
https://i-blog.csdnimg.cn/blog_migrate/1a0dd75ea7ef6757568f83f119fe0e25.png 向votes表中插入 姓名 为赵六 、性别为男、 爱好为 代码、篮球、游泳
(不允许插入不存在的爱好,同时也可以选择插入一个爱好大概多个爱好)
enum类型 与 set类型 允许为空
https://i-blog.csdnimg.cn/blog_migrate/758b08c0d3d6303cf58d88a9e06b26d2.png 只插入 名字,性别与爱好会体现为NULL
NULL表示什么都没有
https://i-blog.csdnimg.cn/blog_migrate/a92f91b2afa2a2123e56c1bf3a4c4155.png ’ ’ 表示有东西,但是 为空串
若set类型 对应的爱好 插入 0 ,则体现为空串
若set类型 对应的爱好 插入 1 ,则体现为第一个设置的值 ,依次类推
https://i-blog.csdnimg.cn/blog_migrate/b1d4a0c92b9f8d18dc3aca273601abbd.png 若set类型 对应的爱好 插入 2,则体现为第二个设置的值
若set类型 对应的爱好 插入 3 ,则体现为第一个设置的值 和第二个设置的值
https://i-blog.csdnimg.cn/blog_migrate/d0b70e5f5bf9bf847d6446d625b756a1.png 因为共有3个爱好,以是设置3个比特位 000
从右到左,依次为从低到高
若表示代码,则为 001
若表示篮球,则为 010
若表示代码和篮球,则为011
若表示游泳,则为 100
enum类型和set类型的查找
在罗列中的查找
https://i-blog.csdnimg.cn/blog_migrate/926fd89e6f16534981d54ccd859f5568.png 输入 select * from votes where gender=‘男’;
挑选出votes表中所有男生的信息
https://i-blog.csdnimg.cn/blog_migrate/ad7455b4eaa6209ff6b2ca04044606f8.png 输入 select * from votes where gender=‘女’;
挑选出votes表中所有女生的信息
在set中的查找
https://i-blog.csdnimg.cn/blog_migrate/9edd2d71334b543d9f4d72b7c2a3038b.png 输入 select * from votes where hobby=‘游泳’;
挑选出votes表中爱好只有游泳的人
有的人爱好是广泛的,其中就包含游泳,但是筛选并不体现
以是需要借助 mysql的筛选函数 —— find_in_set 函数
find_in_set(sub,str,str_list):如果sub在str_list中,则返回下标,如果不在,返回0;
str_list 用逗号分隔的字符串
https://i-blog.csdnimg.cn/blog_migrate/8a7b86847880e45b2a1f816503a8e132.png 输入 select * frin votes where find_in_set(‘游泳’,hobby);
在votes表 的 hobby 查找所有爱好有游泳 的人
https://i-blog.csdnimg.cn/blog_migrate/57b5b2e51424a0004c2138ed5d3f133d.png and相称于 C语言的逻辑与
在votes表 的 hobby 查找所有爱好有游泳 以及 爱好有篮球的人
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]