MySql数据类型

MySql数据类型

数据类型定义了数据在数据库中的存储格式,包括数据的大小、范围、精度等。不同的数据类型具有不同的存储要求。

MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

image.png

数值类型

bit类型

BIT 类型是 MySQL 中用于存储位数据的数据类型。它可以存储固定长度的位序列,允许每个位都是 0 或 1。
BIT 类型的语法为:

BIT[(length)]

其中,length 是可选参数,指定了位序列的长度。如果省略 length,则 BIT 类型默认长度为 1。最大为64。

使用示例

create table bit_example(
    single_bit bit,
    four_bits bit(4),
    eight_bits bit(8)
);

创建了一个名为 bit_example 的表,其中包含三个 BIT 类型的列。single_bit 列的长度为 1,可以存储一个比特位;four_bits 列的长度为 4,可以存储四个比特位;eight_bits 列的长度为 8,可以存储八个比特位。
表结构如下:
image.png

bit类型使用注意事项

  • bit类型是按照ascii码对应的值进行显示的。10对应的比特位是4位太大了,会插入失败。11对应的ascii码是垂直制表符,12对应的是换页符。导致显示如下图。
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 虽然MySQL提供了位类型bit,但一般不建议将数据类型设置成位类型,除非将来这个数据本身就只是给程序看的,并且数据本身非常占用资源。

  • 因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于将来数据库管理员维护数据库或程序员调试程序都是不太方便的。

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

tinyint类型

TINYINT 类型是 MySQL 中的整数类型之一,用于存储小整数值。它通常用于存储较小范围的整数数据,占用较少的存储空间。

TINYINT 类型的语法为:

TINYINT[(length)] [UNSIGNED] [ZEROFILL]

其中,length 是可选参数,用于指定整数的显示宽度。如果省略 length,则默认为 TINYINT(1),即只能存储一个字节的整数值(范围为 -128 到 127)。如果指定了 UNSIGNED,则表示只能存储非负整数值(范围为 0 到 255)。ZEROFILL 表示在显示时用零填充值。

使用示例

CREATE TABLE tinyint_example (
    col1 TINYINT,            -- 范围为 -128 到 127
    col2 TINYINT(3),         -- 指定显示宽度为 3
    col3 TINYINT UNSIGNED,   -- 范围为 0 到 255
    col4 TINYINT(2) ZEROFILL -- 显示宽度为 2,显示时用零填充值
);

表结构如下:
image.png
对表中插入数据。对于col1和col2只支持-128-127范围的数据。col3和col4支持0-255范围的数据。

image.png

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

float类型

FLOAT 类型用于存储单精度浮点数,它可以用来存储大范围的浮点数值,但是精度相对较低。

FLOAT 类型的语法为:

FLOAT[(M, D)]

M 表示总的位数,D 表示小数点后的位数。如果指定了 MD,则 M 表示总的位数,包括小数点前和小数点后的位数,D 表示小数点后的位数。如果省略了 MD,则默认为 FLOAT(24, 0)

使用示例

create table float_example(
    num float(4,2)
    );

创建一个float_example表,表中包含一个float(4,2)的列。
image.png
num列只支持-99.99-99.99范围的数据。超过这个范围就会插入失败。

image.png

decimal类型

DECIMAL 类型用于存储精确的小数值,它能够确保小数值的精度和范围。decimal的精度比float更高。
DECIMAL 类型的语法为:

DECIMAL(M, D)

其中,M 表示总的位数,D 表示小数点后的位数。DECIMAL 类型可以存储任意精度的小数值,范围由 MD 决定。

使用示例

create table decimal_example(
    num1 float(10,8),
    num2 decimal(10,8)
);

创建一个decimal_example表,表中包含一个float(10,8)列和一个decimal(10,8)列。

image.png

向表中两列插入同样的数据,float类型会存在精度丢失。

image.png

字符串类型

char类型

CHAR 类型用于存储固定长度的字符串,其长度在创建表时指定,并且在所有情况下都会占用指定长度的存储空间,不论实际存储的字符串长度是多少。

CHAR 类型的语法为:

CHAR(length)

length 是指定的字符串长度,可以是 0 到 255 之间的整数。

使用示例

create table char_example(
    name char(20)
);

表的结构:

image.png
只能向该列插入20个字符以下的字符串。大于20字符就会出错。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

varchar类型

VARCHAR 类型用于存储可变长度的字符串。与 CHAR 类型不同,VARCHAR 类型的存储空间取决于存储的实际数据长度,而不是固定的。相比于 CHAR 类型,它更加节省存储空间。
VARCHAR 类型的语法为:

VARCHAR(length)

其中,length 是可选参数,用于指定字符串的最大长度。

使用示例

create table varchar_example(
    name varchar(20) --表示可以存放20字符
);

表的结构

image.png

关于VARCHAR(length)的length到底多大和表的编码有关系

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

下面验证了utf8编码length最大是21844
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

char和varchar的比较

image.png

如何选取char或者varchar

  • 如果要存储的数据是定长的,那就使用char类型进行存储,比如身份证号码、手机号、md5等。
  • 如果要存储的数据是变长的,那就使用varchar类型进行存储,比如名字、地址等。
  • char类型的数据是定长的,因此磁盘空间比较浪费,但是效率高(直接访问定长的空间)。
  • varchar类型的数据是变长的,因此磁盘空间比较节省,但是效率低(需要先读取存储字符串的长度,再访问指定长度的空间)。

时间和日期类型

常用的日期有如下三个:

  • DATE 类型: 用于存储日期,格式为 ‘YYYY-MM-DD’,例如 ‘2024-04-30’。
  • DATETIME 类型: 用于存储日期和时间,格式为 ‘YYYY-MM-DD HH:MM:SS’,例如 ‘2024-04-30 12:34:56’。
  • TIMESTAMP类型 :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节。

使用示例

create table date_example(
    t1 date,
    t2 datetime,
    t3 timestamp
);

表的结构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
向表中添加数据时时间戳会自动更新
image.png
更新数据时,时间戳也会自动更新

image.png

timestamp类型使用案例

  1. 创建一个评论表,表当中包含评论人的昵称、评论的内容和评论的发布时间。
create table comment_tb(
    name varchar(20),
    content text(100),
    rtime timestamp
);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
2.向评论表中插入记录时,只需要指明评论人的昵称和评论的内容,评论的发布时间默认会设置成该记录的插入时间。如下:

image.png
3. 当更新评论时,时间戳也会自动更新。

enum和set类型

ENUMSET 是用于存储枚举值集合的数据类型。

  • ENUM 类型: ENUM 类型用于存储枚举值集合中的一个单一值。它允许你从一个预定义的枚举值列表中选择一个值存储在列中。枚举值列表由单引号括起来,用逗号分隔。

使用示例

create table enum_test(
    status enum('active','inactive')
);

status 列只能存储 'active'、`'inactive’这两个值的其中一个。

image.png

  • SET 类型: SET 类型用于存储枚举值集合中的一个或多个值。与 ENUM 类型不同,SET 类型允许你选择多个值存储在列中。枚举值列表同样由单引号括起来,用逗号分隔。

使用示例

create table set_test(
    role set('admin','editor')
);

image.png

使用案例

有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选), (男,女)(单选)

  1. 创建调查表
CREATE TABLE votes (
    name VARCHAR(20),
    hobby SET('游泳', '篮球', '爬山', '武术'),
    sec ENUM('男', '女')
);
  1. 插入数据

这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535 个;当我们添加枚举值时,也可以添加对应的数字编号。不过不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
image.png

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++下等马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值