0.数据类型分类
1.tinyint
创建:
无符号的创建:unsigned在最后面
数值越界测试:
2.bit
bit(M) : 位字段类型。 M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
创建:
内容显示:
是以ASCII来显示的
越界数据:
创建超过64:
3.float
语法:
float(m, d) [unsigned] : m 指定显示长度, d 指定小数位数。占用空间4个字节
创建:
float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
以此( 4, 2 )为基础的示例:
插入示例,包括一些越界情况:
小数部分指定了两位,就算为0,也是两位 .00
但小数部分超过指定位数,不会越界,而是被四舍五入了:
但是四舍五入后的结果越界,仍属于越界:
无符号:
float(4,2) unsigned 范围是 0 ~ 99.99
4.decimal
语法:
decimal(m, d) [unsigned] : 定点数 m 指定长度, d 表示小数点的位数
decimal 用法与 float 相同
decimal 精度更高:
float表示的精度大约是7位。
decimal整数最大位数m为65。支持小数最大位数d是30。
如果d被省略,默为0.如果m被省略,默认是10。
5.char
语法:
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
创建:
插入数据超过上限:
创建超过char上限:
一个汉字是一个字符:
这里的字符和编程里的字符不同。(utf-8 一个汉字占3个字符)
6.varchar
语法:
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
注意 varchar 与 char 不同,char 是开多少就开多少,而 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字节))。
可以看到下图中,开65536后显示的最大 max 是 21845
但是21845也不可以。因为要留 1 ~ 3 个字节来记录使用大小。
2 ^ 8 - 1 == 255
2 ^ 16 - 1 == 65535
2 ^ 24 - 1 == 16777215
所以最大大小是 21844 ,21844 * 3 == 65532 ,剩下三个字节用来记录使用的大小。
(其实两个字节 16 bit 是够的。但是剩一个字节也不能表示字符)
char和varchar比较
如何选择定长或变长字符串?
-
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
定长的意义是,直接开辟好对应的空间
定长的磁盘空间比较浪费,但是效率高。 -
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
变长的磁盘空间比较节省,但是效率低。
7.日期和时间类型
常用的日期类型:
- date :日期 ‘yyyy-mm-dd’ ,占用三字节
- datetime :时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
- timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
创建:
时间戳的一些使用,如评论区评论显示时间:
8.enum和set
语法:
- enum:枚举,“单选”类型;
enum(‘选项1’,‘选项2’,‘选项3’,…);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;
而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;( ! 从1开始)
当我们添加枚举值时,也可以添加对应的数字编号。
- set:集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;
而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....最多64个。
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
创建:
插入枚举不存在的值:
枚举用数字下标来插入:
set 集合用位图插入:
3 : 0011
7 : 0111
都允许为空:
NULL 是没有 ,空字符是有,但是里面没东西 (好比有银行卡,但里面没有钱)
筛选:
select * from '表名' where 条件
筛选不存在的:
如何筛set中选含有某项的所有成员呢?
想筛选爱好有羽毛球的所有成员,可是直接 hobby=‘羽毛球’ ,只能给出只喜欢羽毛球的:
我们可以用 find_in_set 函数来解决:
find_in_set
find_in_set( a , b ) : 找 a 在 b 集合中
测试函数:
如果能找到,返回位图下标。如果找不到,返回 0 。