字符串类型
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为我们要查询的列表 一般为属性名
此时我们要查询爱好中带有游泳的人就可以这么查询了
总结