【MySQL】数据类型(常见类型)-- 详解

一、数据类型分类


二、数值类型


1、tinyint 类型

在 MySQL 中,整型可以指定是有符号的和无符号的,默认是有符号的。

有符号:

插入数据越界测试:

在 MySQL 表中建立属性列时,我们可以发现列名称在前,类型在后。

比如:num tinyint (unsigned)


无符号(unsigned):

可以通过 unsigned 来说明某个字段是无符号的。

插入数据越界测试:

char a = 1234567;

  • C/C++ 中,编译器不会报错,最多也就是报警,这里会发生截断 ,甚至发生隐式转换
  • MySQL 中,在特定的类型中插入不合法的数据,一般会发生拦截,不让我们做对应的操作。

反过来,如果已经有数据被成功插入到 MySQL 中,那么说明插入时一定是合法的。

所以,在 MySQL 中,一般而言,数据类型本身也是一种约束

(能够保证数据库中的数据是可预期、完整的)
注意 :尽量不使用 unsigned,对于 int 类型可能存放不下的数据,int unsigned 同样可能存放不下,与其如此,还不如在设计时,将 int 类型提升为 bigint 类型。


2、bit 类型

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


插入数据越界测试:

为什么下图中的 online 列没有显示内容?

因为 online 是位类型,在显示 0/1 时,是按照 ASCII 码值显示的。只不过当前显示的 ASCII 码值是不可显示的。

如果想在 online 列显示内容,可以输入 select id, hex(online) from t3;(让 online 按照十进制方案插入位结构)

修改 online 的 bit 位:

插入成功:

  • bit 字段在显示时,是按照 ASCII 码对应的值显示。

  • 如果我们有这样的值,只存放 0/1,这时可以定义 bit(1),可以节省空间。


3、小数类型

(1)float
cpp 复制代码
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

插入数据越界测试:

小数:float(4,2) 表示的范围是 -99.99~99.99,默认是有符号浮点数。

MySQL 在保存值时会进行四舍五入

注意:在合法范围内允许五入,但在边界值五入会导致整体的浮点数增多,从而超过浮点数对应的范围,所以不是所有情况都可以五入。


unsigned:

如果定义的是 float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0~99.99(相当于有符号浮点数删减去负数取值部分)。

插入数据越界测试:

整数部分也可能有精度损失。


(2)decimal
cpp 复制代码
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99
    插入数据越界测试:


decimal 和 float 的区别:

float 和 decimal 表示的精度不一样。

  • float 表示的精度大约是 7 位。(会发生截断或四舍五入)
  • decimal 整数最大位数 m 为 65。支持小数最大位数 d 是 30。如果 d 被省略,默认为 0。如果 m 被省略,默认是 10。(完全保证精度准确)
    建议如果希望小数的精度高,推荐使用 decimal。

三、字符串类型

1、char

cpp 复制代码
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255



char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过 2 个, 最多只能是 255。
插入数据越界测试:

  • 在 utf-8 中一个汉字一般占 3 个字节,在 gbk 中一个汉字一般占 2 个字节。

注意:char 类型的单位为字符,MySQL 中的字符和 C/C++ 中的字符概念同,语言上的字符是一个字符对应一个字节,而这里的一个字符就是代表一个符号。


2、varchar

cpp 复制代码
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

插入数据越界测试:

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

  • 当我们的表的编码是utf-8 时,varchar(n) 的参数 n 最大值是 65532/3=21844(因为在 utf 中,一个字符占用 3 个字节)。
  • 如果编码是gbk,varchar(n) 的参数 n 最大是 65532/2=32766(因为 gbk 中,一个字符占用 2 字节)。
    ​​​​​​​

3、char 和 varchar 比较

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

四、日期和时间类型


1、date

date 日期格式:'yyyy-mm-dd',占用 3 字节。


2、datetime

datetime 时间日期格式:'yyyy-mm-dd HH:ii:ss' 表示范围为 1000~9999 ,占用 8 字节。​​​​​​​


3、timestamp

timestamp 时间戳会自动更新,从 1970 年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用 4 字节。


五、enum 和 set

插入数据越界测试:


1、enum

  • enum:枚举,"单选" 类型;
  • enum('选项1', '选项2', '选项3',...);
    该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是 "数字",因为这些选项的每个选项值依次对应如下数字:1,2,3,... 最多 65535 个(从 1 开始);当我们添加枚举值时,也可以添加对应的数字编号。

2、set

  • set:集合,"多选" 类型;
  • set('选项值1', '选项值2', '选项值3', ...);
    该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是 " 数字 " ,因为这些选项的每个选项值依次对应如下数字: 1,2,4,8,16,32 , ... 最多 64 个。
    1 对应的就是 '选项值1',2 对应的是 '选项值2',3 对应的是 '选项值1,选项值2'...跟二进制比特位的计数有关。 比特位由低到高依次对应的是选项值从左向右。
    说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

3、集合查询使用 find_ in_ set 函数

​​​​​​​
find_in_set(sub, str_list) :

  • 如果 sub 在 str_list 中,则返回下标;
  • 如果不在,返回 0; str_list 用逗号分隔的字符串。
相关推荐
Ren_xixi2 小时前
redis和mysql的区别
数据库·redis·mysql
追逐时光者4 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
drebander4 小时前
MySQL 查询优化案例分享
数据库·mysql
小林coding7 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
18号房客7 小时前
高级sql技巧进阶教程
大数据·数据库·数据仓库·sql·mysql·时序数据库·数据库架构
翔云1234568 小时前
MySQL purged gtid是如何生成和维护的
数据库·mysql
胡西风_foxww10 小时前
【es6复习笔记】集合Set(13)
前端·笔记·es6·set·集合
平行线也会相交10 小时前
云图库平台(三)——后端用户模块开发
数据库·spring boot·mysql·云图库平台
恒辉信达11 小时前
hhdb客户端介绍(53)
数据库·mysql·hhdb·数据库可视化界面客户端
Hello.Reader12 小时前
Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
redis·mysql·缓存