MySQL数据类型


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 。

在这里插入图片描述

函数使用:

在这里插入图片描述

同时含有多个爱好呢?其实类似 c 语言写法( 其实是py ):

在这里插入图片描述

位图查找:

在这里插入图片描述

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值