【MySQL】数据类型

文章目录
  • [1. 数据类型分类](#1. 数据类型分类)
  • [2. 数值类型](#2. 数值类型)
    • [2.1 整型](#2.1 整型)
    • [2.2 位类型](#2.2 位类型)
    • [2.3 小数](#2.3 小数)
    • [2.4 bool](#2.4 bool)
  • [3. 字符串类型](#3. 字符串类型)
    • [3.1 字符](#3.1 字符)
    • [3.2 日期与时间](#3.2 日期与时间)
    • [3.3 enum 和set](#3.3 enum 和set)

1. 数据类型分类

2. 数值类型

2.1 整型

  1. tinyint

注意:unsigned 放在类型的后面

  1. smallint

mediumint、int、bigint依次类推。

2.2 位类型

复制代码
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

有了bit类型的值,只存放0或1,这时可以定义bit(1),可以节省空间。

2.3 小数

  1. float

语法:

复制代码
float[(m, d)] [unsigned] : m指定显示长度,d指定小数位数

占用4个字节空间

  • 小数点后的位数如果少于指定位数,
    • 总位数不符合,则插入失败
    • 总位数符合,插入成功
  • 小数点后的位数如果大于指定位数
    • 四舍五入后符合,插入成功
    • 四舍五入后不符合,插入失败

如果定义的是float(4,2) unsigned ,因为把它指定为无符号的数,范围是 0 ~ 99.99

double类型比float精度更大,占用8字节

  1. decimal

    decimal(m, d) unsigned : 定点数m指定长度,d表示小数点的位数

decimal(5,2) 表示的范围是 -999.99 ~ 999.99

decimal(5,2) unsigned 表示的范围 0 ~ 999.99

decimal和float很像,但是有区别:二者表示的精度不一样

  • float表示的精度大约是7位。
  • decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0,如果m被省略,默认是10。

2.4 bool

3. 字符串类型

3.1 字符

  1. char

    char(L): 固定长度字符串,L是可以存储的长度,单位为字符

最大长度值可以为255

  1. varchar

    varchar(L): 可变长度字符串,L表示字符长度

L表示最多可存放多少个字符,最大长度65535个字节

说明:

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据真实大小,所以说有效字节数是65532。

当表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844因为utf8中,一个字符占用3个字节

如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

char VS varchar

如何选择定长或变长字符串?

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号
  • 如果数据长度有变化,就使用变长(varchar),比如:名字,地址,但是你要保证最长的能存的进去。
  • 定长的磁盘空间比较浪费,但是效率高。
  • 变长的磁盘空间比较节省,但是效率低。
  • 定长的意义是,直接开辟好对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

3.2 日期与时间

常用的日期有如下三个:

  • date :日期 'yyyy-mm-dd' ,占用3字节
  • datetime :时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用8字节
  • timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss ,格式和 datetime 完全一致,占用4字节

3.3 enum 和set

  1. enum

语法:

  • enum:枚举,"单选"类型;

    enum('选项1','选项2','选项3',...);

  • 该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;

  • 而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

  1. set
  • set:集合,"多选"类型;

    set('选项值1','选项值2','选项值3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,...最多64个。


如果我要查找hobby是跑步的,应该怎么查呢?

不能查询出所有爱好为跑步的人

需要使用集合查询使用find_ in_ set函数

  • find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
  • str_list 用逗号分隔的字符串。
相关推荐
alexhilton1 小时前
将应用迁移到Navigation 3:痛点、加班和紧急修复
android·kotlin·android jetpack
这个DBA有点耶6 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
杉氧7 小时前
Navigation Compose 深度实践:如何优雅地串联起你的全栈 App?
android·架构·android jetpack
这个DBA有点耶8 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技8 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend9 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
雨白10 小时前
指针与数组的核心机制
android
ClouGence12 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
黄林晴15 小时前
Room 3.0 正式发布!包名彻底重构,KMP 成为核心主线
android·android jetpack
三少爷的鞋15 小时前
Kotlin 协程环境下的 DCL 懒加载:别把线程时代的经验直接搬过来
android