Mysql专栏:@Mysql
本篇博客简介:介绍mysql的数据类型
mysql数据类型
- 数据类型分类
- 数值类型
- tinyint类型越界测试
- bit类型
- 小数类型
- float类型
- decimal类型
- 字符串类型
- char
- varchar
- 时间和日期类型
- enum和set
- enunm
- set
- 总结
数据类型分类
为什么要存在数据类型呢?
mysql中存在数据类型主要是为了以下两点
- 数据类型决定了自己需要多少的空间以及系统会给你分配多少的空间 数据库作为一个要使用磁盘空间的工具 数据类型的存在是必要的
- 类型是一种约束 只允许向数据库插入合法的数据
mysql中常见的数据类型如下图:
数值类型
类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
TINYINT(无符号) | 1 | 0 | 255 |
TINYINT(有符号) | 1 | -128 | 127 |
INT(无符号) | 4 | 0 | 4294967295 |
INT(有符号) | 4 | -2147483648 | 2147483647 |
BIGINT(无符号) | 8 | 0 | 18446744073709551615 |
BIGINT(有符号) | 8 | -9223372036854775808 | 9223372036854775807 |
tinyint类型越界测试
我们首先创建一张表 里面有tinyint数据类型的一列
之后我们往这一列中插入数据
我们发现 数据如果在tinyint的最小值与最大值之间则可以插入 如果不在这个范围则mysql直接报错
通过上面的现象我们也能很好的解释约束这一概念 即只允许插入合法的数据
bit类型
语法
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
实例:
我们尝试向t1这个表中插入两个数据
观察插入后的现象我们可以发现 int类型的数据可以正常插入 但是bit类型的数据显示的却十分奇怪
其实这些数据就是对应的ascll码值
也就是说对应bit类型的数据 在数据库表中会显示的是ascll码值
使用场景
当我们只需要使用0和1来标志一个值的时候我们可以定义bit(1)
小数类型
float类型
语法
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
实例
float(4,2)表示的范围是-99.99 ~ 99.99 MySQL在保存值时会进行四舍五入 即 99.994为99.99 99.995为100.00
下面的试验会验证上面所说的话
我们首先创建一个员工工资表 里面有员工的编号还有他们的薪水
接着我们往表中插入几组数据
我们可以发现salary的数据被限制在了-99.99 ~ 99.99之间 更准确的说是-99.994 ~ 99.994之间
如果我们将float限制为无符号数数据的范围会发生什么变化呢?
插入数据后我们可以发现
此时我们插入正值 0 ~ 99.994仍然可以成功 但是插入负值便会报错了
decimal类型
decimal类型与float类型的用法和特性基本相同
唯一一点需要我们注意的是decimal的精度要比float类型的精度高(float类型的精度大概为小数点后七位)
下面是试验证明
我们可以发现 当我们存储12.12345678这个数字的时候 decimal的数据能够正常储存 而floact类型的数据却失真了
所以说当我们想要存储小数点后更加精确的数字时我们可以使用decimal类型的数据
字符串类型
char
语法
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
案例(char)
我们创建一张表 其中姓名属性规定为两个字符
接着我们开始插入数据
我们发现当我们插入两个字母的时候可以插入 当我们插入三个字母的时候sql就报错了
当我们插入两个中文的时候可以插入 当我们插入三个中文的时候sql就报错了
此外char类型的最大长度为255
字符的含义
很奇怪的一点是 在我们之前学习C/C++阶段 我们知道一个字母所占的字节数和中文所占的字节数是不同的 那么在mysql中为什么将一个字母等同于一个中文呢
实际上不管是字母和汉字 在mysql中都将它们看作是一个字符 跟所占的字节数和大小都没有关系
在我下面的博客内容中会出现字符和字节两个词语 大家一定不要混淆!
varchar
语法
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
实际上varchar的用法和char类型也是一模一样的 不同的是varchar的储存大小还有它们的存储方式
varchar类型的存储大小
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)
char和varchar存储方式的比较
在上图中我们可以很明显的看到 在制定相同的字符大小时 存储不同的数据 char和varchar所占用的字节数是不一样的
char所占用的字节数恒为指定数 而varchar则遵循一个算法实时计算
如何选择变长和定长字符
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
时间和日期类型
常用的日期有下面三个
- date :日期 ‘yyyy-mm-dd’ ,占用三字节
- datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
- timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用
四字节
之后我们插入一组时间数据
我们可以发现t1 t2的数据就是我们所插入的数据 而t3的数据就是现在的实时时间
如果我们更改t1的时间
如上图 t3的时间也会被修改 而t2的时间不受影响
enum和set
enunm
语法:
enum:枚举,“单选”类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考
虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535
个;当我们添加枚举值时,也可以添加对应的数字编号。
实例
比如说我们建立一张表 表中有枚举类型的数据性别
当我们像表中插入数据的时候可以选择性别为男或者女如果填写其他则会报错
而枚举的数据在实际的存储中是按照数字存储的并且是从1开始
所以说1代表男 2代表女 输入其他数字则插入失败
set
语法
set:集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率
考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,…
最多64个。
不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
set的数字表示使用的是二进制的形式 如下图
1代表有这个爱好 而0代表没有这个爱好 上图中的111就代表有这三个爱好 而111的二进制数字转化为十进制后是7
实例
我们在上面的表中加入一个爱好选项
插入数据的时候就可以使用数字或者是文字插入爱好了
如何查询爱好
- 我们可以通过等于号查询
但是我们这里发现使用等于号查询只能查询出爱好中只有游泳的人而不能查询出爱好中有游泳的人
于是这里就有第二种查询方式
- 集合查询使用find_ in_ set函数:
语法:
find_in_set(sub,str_list)
参数说明:
- sub为我们要查询的字符串
- str_list为我们要查询的列表 一般为属性名
此时我们要查询爱好中带有游泳的人就可以这么查询了