当前位置: 首页 > article >正文

MySQL数据类型

文章目录:

  • 数据类型分类
  • 数值类型
    • tinyint类型
    • bit类型
    • float类型
    • decimal类型
  • 字符串类型
    • char类型
    • varchar类型
    • char vs varchar
    • 日期和时间类型
    • enum和set类型

数据类型分类

MySQL数据库支持多种数据类型,可以用于定义列的数据类型,以下是 MySQL 中常见的数据类型:

在这里插入图片描述

不同的数据类型在存储和处理数据时,会有不同的性能和空间占用,因此在设计数据表时,需要根据实际需求来选择合适的数据类型来存储数据。

数值类型

在这里插入图片描述
在使用数值类型时,应该根据实际需求选择合适的数据类型和长度,以避免数据溢出或浪费存储空间的问题。同时,应该尽量避免使用浮点数类型进行计算,因为浮点数的精度有限,可能会导致精度误差。

tinyint类型

在 MySQL 中,TINYINT 是一种整数类型,它使用 1 个字节来存储整数数据。TINYINT 乐意存储的范围为 -128 ~ 127(有符号)0 ~ 255(无符号)

TINYINT 类型最常用的情况是,用于标记某个状态或者开关,例如:开关状态、是否删除等。由于 TINYINT 只使用一个字节,因此在存储空间上比其它整数类型更加节省。

有符号 TINYINT 类型范围测试:

在这里插入图片描述

无符号 TINYINT 类型范围测试:

在这里插入图片描述

  • 在 MySQL 中整形可以指定是有符号的和无符号的,默认情况下是有符号的。
  • 可以通过 unsigned 来定义无符号 TINYINT。

注意:尽量不要使用 unsigned ,对于 int 类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,不如在设计时,将 int 类型提升为 bigint 类型。

bit类型

在 MySQL 中,bit 数据类型用于存储位数据。它可以存储 1 个比特位或多个比特位,最多可以存储 64 个比特位。

基本语法:

bit[(M):位字段类型,M表示每个值的位数,范围从164。如果M被忽略,默认为1.

在创建表时,使用 bit 数据类型定义一个变量,如下所示:

在这里插入图片描述

在表中插入数据如下,插入数据后发现一个异常现象,bit类型的数据 10 没有能够正确显示:

在这里插入图片描述

在 MySQL 中,bit 类型的数据在显示时按照 ASCII 码表对于的值进行显示。在 ASCII 码表中,10 表示的是控制字符 LF,即换行符。因此查询显示时就会发生异常。若向表中插入记录 id 和 flag 均为 65,则在 ASCII 中对应的是 A,如下所示:

在这里插入图片描述

bit 使用的注意事项:

  • bit 字段在显示时,是按照 ASCII 码表对应的值显示的。
  • 若某个变量只有两种状态(如0或1),这时可以定义 bit(1),可更好的节省空间。

float类型

在 MySQL 中,float 是一种浮点数数据类型,用于存储具有小数部分的数字。float 类型需要指定精度和范围。

语法:

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

示例1:float(4,2) 表示的范围是 -99.99 ~ 99.99,MySQL 在保存值时会进行四舍五入。

创建一个表,表中包含一个 float(4,2) 类型的列,默认情况下是有符号类型,如下所示:

在这里插入图片描述

float(4,2) 的范围是 -99.99 ~ 99.99,但是 MySQL 在保存数据时会进行四舍五入,因此 float(4,2) 的实际范围是-99.994 ~ 99.994。因此插入该范围的数据都能成功:

在这里插入图片描述

t1 表中插入该范围以外的数据,插入就会出错:

在这里插入图片描述

示例2:若定义的是 float(5,2) unsigned 时,因为是无符号的,所以范围是 0 ~ 999.99

创建一个表,表中包含一个 float(5,2) 类型的列,将该列定义为无符号,如下所示:

在这里插入图片描述

MySQL 在保存数据时会进行四舍五入,因此 float(5,2) 的实际范围是0 ~ 999.994。因此插入该范围的数据都能成功:

在这里插入图片描述

t2 表中插入该范围以外的数据,插入就会出错:

在这里插入图片描述

decimal类型

在 MySQL 中,decimal 是一种精确数值类型,用于存储具有小数部分的数字。decimal 类型需要指定精度和范围,它可以存储高精度的十进制数。可以存储从 -10^38+1 到 10^38-1的数字,精度可以达到65位小数。DECIMAL类型在存储和计算数字时保持精度不变,因此适用于需要高精度计算的场合,如财务,金融等。

语法:

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

说明:

  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围是 0 ~ 999.99。decimal 和 float 很像,但是有区别。float 和 decimal 表示的精度不一样。

示例:创建精度为 10,小数位为 8 的 decimal 类型的列,和创建精度为 10,小数位为 8 的 float 类型的列,如下所示:

在这里插入图片描述

向表中插入数据,观察 float 和 decimal 的区别:
在这里插入图片描述

总结:综上所述,若需要进行高效的计算和存储,可选择 float 类型,但是需要注意精度损失的问题;若对数据精度要求比较高,可选择 decimal 类型,但需要注意存储空间的使用。在实际情况下,需要具体根据业务的需求和数据特点来选择合适的数据类型。

在 MySQL 中,float 数据类型的精度大约为 7 位,而 decimal 数据类型支持高精度的计算,整数最大位数为 65 位,小数最大位数为 30 位。若未指定小数位数,则默认为0,若未指定整数位数,则默认为10。

字符串类型

char类型

在 MySQL 中,char 类型是一种固定长度的字符类型。它用于存储长度固定且较短的字符串。它可以存储 0~255 个字符,但是实际存储的字符数值取决于定义时指定的长度。

语法:

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

示例:创建一个长度为10的 char 类型的语句如下:

在这里插入图片描述

向表中插入数据测试,如下所示,它的存储长度不超过10个字符的字符串:

在这里插入图片描述

需要注意的是,char 类型的存储空间是固定的,无论实际存储的字符串长度是多少,都会占用指定长度的存储空间。因此,char 类型的存储空间通常比较浪费,适合存储长度固定的字符串。如果需要存储长度不固定的字符串,可以考虑使用 varchar 类型。但是 char 类型相较于 varchar 类型更有效率。

varchar类型

在 MySQL 中,varchar 类型是一种可变长度的字符类型。它用于存储长度可变的字符串,且不会浪费存储空间。varchar 类型可以存储 0 ~ 65535 个字符。

语法:

varchar(L): 可变长度字符串,L表示字符长度,最大长度为65535个字节。

示例:定义一个最大长度为10的 varchar 类型的语句如下:

在这里插入图片描述

向表中插入数据进行测试:

在这里插入图片描述

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

  • varchar 长度可以指定为 0 ~ 65535 直接的值,但是有 1-3 个字节用于记录数据大小,所以说有效字节数是 65532。
  • 若编码是 utf8 时,varchar(n) 的参数 n 最大值是 65532 / 3 = 21844(因为 utf 中,一个字符占用 3 个字节),若编码是 gbk,varchar(n) 的参数 n 最大值是 65532 / 2 = 32766(gbk 中,一个字符占用两个字节)。

使用 utf8 进行验证:

在这里插入图片描述

需要注意的是,varchar 类型的索引效率不如 char 类型高。若 varchar 的长度定义过大,可能会导致额外的存储空间占用和查询效率降低的问题。因此定义 varchar 类型时,应根据实际情况选择适合长度。

char vs varchar

在这里插入图片描述

char 类型和 varchar 类型比较:

  • 存储方式:char 类型是一种固定长度的字符类型,无论实际存储的字符数是多少,都会占用固定长度的存储空间。varchar 类型是一种可变长的字符类型,实际存储空间取决于存储的字符串长度。
  • 存储空间:char 类型相对于 varchar 类型更浪费存储空间。
  • 索引效率:char 类型的列上建立索引效率更高,在 varchar 类型上建立索引效率相对较低。
  • 使用场景:char 类型适合存储长度固定的字符串,例如:身份证号码、银行卡号等。varchar类型适合存储长度不固定的字符串,例如:用户名,地址等。

如何选择 char 类型或者 varchar 类型:

  • 如果数据长度固定,使用 char ,如:身份证、手机号等。
  • 如果数据长度不固定,使用 varchar,如:姓名、地址等,但是要保证最长的能够存进去。
  • char 类型浪费空间,效率高;varchar 类型节省空间,效率低。
  • 定长的意义是直接开辟好相应空间,变长的意义是在不超过自定义范围的情况下,使用多少,开辟多少。

日期和时间类型

常用的日期有如下三个:

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

示例:创建一个表,其中包含以上3个时间日期类型,如下所示:

在这里插入图片描述

向表中插入数据,若不手动输入第三列,则默认获取当前时间:

在这里插入图片描述

注意:MySQL 中时间和日期类型的取值范围是有限制的,因此在存储时间和日期数据时需要注意数据的合法性。timestamp 类型比较特殊,它会在数据行发生修改时自动更新当前时间。这个行为可以通过 ON UPDATE CURRENT_TIMESTAMP 来控制。

enum和set类型

在 MySQL 中,enum 和 set 是两种常见的枚举类型。

enum 类型: 表示枚举值,只能取预定义的值之一。enum 类型可以包含多个枚举值,每个枚举值用逗号分隔。

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而出于效率考虑,这些值实际存储的是 “数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,4 … 最多可以有 65535 个;当我们添加枚举值时,也可以添加对应的数字编号。

set 类型: 也可以表示枚举值,但它可以取多个预定义的值。set 类型可以包含多个枚举值,每个枚举值使用逗号分隔。

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

示例:有一个调查表 votes,需要调查人们喜欢的颜色,如在(红色、绿色、黄色、黑色等)中去选择【多选】,(男,女)【单选】:

在这里插入图片描述

向表中插入数据如下:

在这里插入图片描述

如上,我们可以使用数字来标识各个值。在 set 中,可以使用二进制来表示选中哪些选项(例如,上面 set 中插入10 ,10 的二进制是 1010,从表中列举的值从右向左看,1表示选择,0表示未选中)。enum 中单项选择直接使用数字进行选择。

需要注意的是,虽然 enum 和 set 可以用数字表示选项,但这通常不是最佳实践。如果你使用数字而不是文本值,可能会使数据更难以理解和维护。

有以下数据,查找所有喜欢绿色的人:

在这里插入图片描述

当我们使用 where 进行条件筛选时,选出的是只喜欢绿色的人,而没有将喜欢的颜色有绿色的人全部查找出来,这样显然是不行的。接下来我们介绍一个函数,用于完成该查询。

在这里插入图片描述

集合查询使用 find_in_set 函数:

在 MySQL 中,find_in_set() 函数用于在一个逗号分隔的字符串中查找一个子字符串,并返回其在字符串中的位置。该函数语法如下:

find_in_set(sub,str_list);

如果sub在str_list中,则返回下标;如果不在,则返回0;str_list使用逗号分开。

示例:函数返回的是第一次出现 ‘a’ 的位置的下标。

在这里插入图片描述

查询表 votes 中喜欢的颜色有绿色的:

在这里插入图片描述


http://www.kler.cn/a/14533.html

相关文章:

  • 1.10和1.11和1.12、Makefile
  • ADKEY多按键制作阻值选择
  • OpenJudge - 39:多项式输出
  • Jenkins+Python自动化测试持续集成详细教程(全网独家)
  • 基于html+css的图片展示32
  • Mac 安装Charles抓包工具及使用教程(什么,都什么时候了还不会抓包)
  • 25K 入职阿里的那天,我特么哭了
  • 网络系统管理Linux服务部署 试卷
  • 容器网络与生态
  • Java内存模型详解
  • 【Tensorflow】模型如何加载HDF文件数据集?
  • 银行数字化转型导师坚鹏:银行业务数字化创新工作坊(简版)
  • KMP字符串匹配算法详解
  • GitHub 开源神器 Bark模型,让文本转语音更简单
  • 宝光股份 | 打造营销管理数据平台,实现营销管理和业务双提升
  • GStreamer第一阶段的简单总结
  • Autosar-Interface接口
  • STM32常用的开发工具有哪些
  • php弱类型相等漏洞绕过
  • 为什么说过早优化是万恶之源?