Mysql中的数据类型用法及解读

 更新时间:2025年04月09日 08:50:43   作者:猫咪-9527  
这篇文章主要介绍了Mysql中的数据类型用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.1数据类型分类

MySQL 数据类型可以分为三大类:

  1. 数值类型:包括整数类型、浮点类型、定点类型等。
  2. 字符串类型:包括 CHARVARCHARTEXT 等。
  3. 日期和时间类型:包括 DATEDATETIMETIMESTAMP 等。

1.2 数值类型

数值类型在 MySQL 中主要有整型和小数型两种类型。

1.2.1 tinyint 类型

tinyint 类型是一个小的整数类型,通常用于存储小范围的整数。

范围

  • 有符号:-128 到 127
  • 无符号:0 到 255
  • 如果插入超出该范围的值,MySQL 会报错。

示例:

CREATE TABLE tt1 (num tinyint);
INSERT INTO tt1 VALUES(1);   -- 成功插入
INSERT INTO tt1 VALUES(128); -- 报错,超出范围

有符号正数:

有符号负数:

无符号数:

1.2.2 bit 类型

bit 类型用于存储位字段,可以存储二进制数据。

示例:

CREATE TABLE tt4 (id INT, a BIT(8));
INSERT INTO tt4 VALUES(10, 10); -- 存入10,显示可能是位二进制值

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

  • 你可以定义存储的位数,例如 bit(8) 表示存储 8 位的二进制数。
  • 默认情况下,bit 类型在存储时会显示为 ASCII 字符。

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

1.2.3 小数类型

1.2.3.1 float 类型

float 类型用于存储浮动的小数值,支持四舍五入。

  • 你可以通过 float(M, D) 来定义精度和小数位数,其中 M 为总位数,D 为小数位数。

示例:

CREATE TABLE tt6 (id INT, salary FLOAT(4, 2));
INSERT INTO tt6 VALUES(100, -99.99);  -- 成功插入
INSERT INTO tt6 VALUES(101, -99.991); -- 会进行四舍五入,存储为 -99.99

案例:

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

如果是无符号数的float,其中的负数部分会被舍去。例如:

无符号小数:float(4,2)表示的范围是0 ~ 99.99,MySQL在保存值时会进行四舍五入。

1.2.3.2 decimal 类型

decimal 类型是定点数,精度更高,适用于需要精确存储小数的情况。

  • decimal(M, D) 表示最多可以存储 M 位数,其中 D 位是小数部分。

示例:

CREATE TABLE tt7 (id INT, salary DECIMAL(5, 2));
INSERT INTO tt7 VALUES(100, 99.99);  -- 成功插入

注: decimal类型和float类型很像,他们都支持四舍五入,他们的无符号类型都是舍去负数,但是decimal类型的精度比float类型更高。

例如:

1.3 字符串类型

1.3.1 char 类型

char 是固定长度的字符串类型,适用于存储长度固定的字符串数据。

  • 长度 L 最大为 255 字符。

示例:

CREATE TABLE tt9 (id INT, name CHAR(2));
INSERT INTO tt9 VALUES(100, 'ab');    -- 成功插入
INSERT INTO tt9 VALUES(101, '中国');  -- 成功插入

1.3.2 varchar 类型

varchar 是可变长度的字符串类型,适用于存储长度不固定的字符串数据。

  • 最大长度是 65535 字节,实际存储的长度取决于字符集。

示例:

CREATE TABLE tt10 (id INT, name VARCHAR(6));
INSERT INTO tt10 VALUES(100, 'hello');           -- 成功插入
INSERT INTO tt10 VALUES(100, '我爱你,中国');     -- 成功插入

请思考为什么会出现这种情况?

原因是:CHARVARCHAR 类型在 MySQL 中存储的是字符而非字节。在默认的 utf8 字符集下,每个字符通常占用 3 个字节。

由于 VARCHAR 是可变长度的字符串类型,它不仅存储字符本身,还需要额外的空间来记录实际数据的长度。因此,在 utf8 编码下,VARCHAR 字段的最大字符数是 21844。

这个限制是因为 VARCHAR 的最大字节数为 65535 字节,而每个字符占用 3 个字节,再加上存储长度的开销(最多 3 个字节),因此实际能存储的最大字符数为 65535 / 3 = 21845,减去存储长度所需的空间后,最终可以存储最多 21844 个字符。

1.3.3charVSvarchar

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

定长(CHAR

如果数据的长度确定且不会变化,使用定长(CHAR)类型更为合适。例如:身份证、手机号、MD5 值等。

变长(VARCHAR

如果数据的长度有变化,可以使用变长(VARCHAR)类型。例如:名字、地址等数据。

优缺点对比:

定长(CHAR

优点

  • 存储固定长度的数据时效率高。
  • 因为空间已经预分配,查询时访问速度较快。

缺点

  • 存储短于定义长度的数据时会浪费空间。
  • 例如,CHAR(10) 存储 3 个字符的数据时,会浪费 7 个字符的空间。

变长(VARCHAR

优点

  • 根据实际字符长度分配空间,节省存储。

缺点

  • 需要动态计算长度,相比 CHAR 稍慢。
  • 在频繁查询或更新时,效率可能较低

1.4 日期和时间类型

常用的日期和时间类型:

  • DATE:存储日期,格式为 'yyyy-mm-dd'
  • DATETIME:存储日期和时间,格式为 'yyyy-mm-dd HH:ii:ss'
  • TIMESTAMP:存储时间戳,从1970年1月1日开始计算。

1.5 enum 和 set 类型

1.5.1 enum 类型

enum 类型用于存储“单选”项。每个选项都有一个数字编号,对应存储在数据库中的实际值。

示例:

CREATE TABLE votes (username VARCHAR(30), gender ENUM('男', '女'));
INSERT INTO votes VALUES('张三', '男');

enum里面的值默认下表从0开始,0表示空NULL

1.5.2 set 类型

set 类型用于存储“多选”项,可以选择多个值,值的组合会以数字标识。

示例:

CREATE TABLE votes (username VARCHAR(30), hobby SET('登山', '游泳', '篮球', '武术'));
INSERT INTO votes VALUES('雷锋', '登山,游泳');

爱好:爬山登月打球游泳睡觉
601100
510100

原因: SET 类型中的值是按二进制位存储的,每个选项对应一个二进制位。每个选项的值会用一个数字表示,数字的每一位代表一个选项的状态(是否选中)。这样可以节省存储空间。

1.6 find_in_set函数

find_in_set(sub, str_list) 函数用于查找一个字符串是否在由逗号分隔的字符串列表中。

  • 如果 substr_list 中,返回其位置(下标)。
  • 如果 sub 不在 str_list 中,返回 0。

示例:

  • find_in_set('a', 'a,b,c') 返回 1,表示 'a''a,b,c' 中的第一个位置。
  • find_in_set('d', 'a,b,c') 返回 0,表示 'd' 不在 'a,b,c' 中。

同时它可以让查找更方便

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈MySQL next-key lock 加锁范围

    浅谈MySQL next-key lock 加锁范围

    我们知道MYSQL NEXT-KEY LOCK是用来防止幻读,那么MySQL next-key lock 加锁范围是多少,很多人都不知道,本文就来详细的介绍一下
    2021-06-06
  • MySQL和Oracle批量插入SQL的通用写法示例

    MySQL和Oracle批量插入SQL的通用写法示例

    当我们要往数据库中批量保存多条数据得时候,分不同数据库,有不同得插入方式,这篇文章主要给大家介绍了关于MySQL和Oracle批量插入SQL的通用写法的相关资料,需要的朋友可以参考下
    2021-11-11
  • mysql存储过程详解

    mysql存储过程详解

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它
    2012-07-07
  • Linux系统每日定时备份mysql数据的方法步骤

    Linux系统每日定时备份mysql数据的方法步骤

    这篇文章主要介绍了Linux系统每日定时备份mysql数据的方法步骤,包括创建文件夹、编写脚本、设置定时任务和测试脚本,详细步骤涵盖从文件夹创建到脚本执行的全过程,帮助用户实现数据库的自动备份,需要的朋友可以参考下
    2024-11-11
  • springboot启动404问题以及解决方案

    springboot启动404问题以及解决方案

    这篇文章主要介绍了springboot启动404问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL之where使用详解

    MySQL之where使用详解

    我们需要获取数据库表数据的特定子集时,可以使用where子句指定搜索条件进行过滤。本文主要介绍了MySQL之where使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • MySQL性能之count* count1 count列对比示例

    MySQL性能之count* count1 count列对比示例

    这篇文章主要为大家介绍了MySQL性能之count* count1 count列对比示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • MySQL8中大小写敏感与不敏感排序规则的选择(根据字段语义)

    MySQL8中大小写敏感与不敏感排序规则的选择(根据字段语义)

    MySQL排序规则决定字符比较、排序等行为,与字符集绑定,影响ORDER BY等操作,这篇文章主要介绍了MySQL8中大小写敏感与不敏感排序规则的选择,需要的朋友可以参考下
    2026-04-04
  • mysql外键(Foreign Key)介绍和创建外键的方法

    mysql外键(Foreign Key)介绍和创建外键的方法

    这篇文章主要介绍了mysql外键(Foreign Key)命令和添加外键方法,需要的朋友可以参考下
    2014-02-02
  • Mysql IO 内存方面的优化

    Mysql IO 内存方面的优化

    这篇文章主要介绍了Mysql IO 内存方面的优化 的相关资料,需要的朋友可以参考下
    2016-01-01

最新评论