【MySQL入门指南】MySQL中的数据类型总结

news2024/11/26 20:45:01

文章目录

  • MySQL数据类型
    • 一、数值类型
        • 1.类型总览
        • 2.BIT类型
        • 3.INT系列类型
        • 4.浮点数类型
          • 1)float与double
          • 2.float与decimal
    • 二、字符串类型
        • 1.类型总览
        • 2.CHAR类型
        • 3.VARCHAR类型
    • 三、日期与时间类型
    • 四、枚举类型
        • 1.enum类型
        • 2.set类型
        • 3.在set中的查找

MySQL数据类型

​ MySQL中支持的数据类型大致可以分为四类:数值类型、文本/二进制类型、时间日期类型,以及字符串类型。下面分别加以总结:

一、数值类型

1.类型总览

image-20230424210300565

[基本说明]:

  • 数据类型划分精细是很有必要的。例如我们存储用户的年龄,使用 TINYINT UNSIGNED 占用1字节就足够了。如果INT占用4字节,虽然看起来只是多了3字节,但是×10万,×100万,加上数据库的备份拷贝,浪费的空间也是不少的

  • 在C语言中,当我们的数据发生越界时,这些数据就会被截断。但是在MySQL中,数据发生越界时会直接终止当前操作,从而保证数据的可靠性。试想,如果允许截断,那么数据库中存储的1是它本来就是1,还是截断后变成1的,这就会产生歧义,但数据库对可靠性的要求是很高的。

 这在本质上就是一种约束。约束在MySQL中是一种很重要的概念,它倒逼着程序员必须要遵守一定的规则。

2.BIT类型

①基本语法

bit[M] -- 位字段类型。M表示每个值的比特位数,范围从1~64,默认为1
  • bit(1)则只能存储一个比特位的数值,数据范围在0~1
  • bit(8)则可以存储八个比特位的数字,数据范围在0~255

②案例一

mysql> create table t1(
    -> id int,
    -> b bit(8)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into t1 values(10, 10);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------+------+
| id   | b    |
+------+------+
|   10 | 
    |
+------+------+
1 row in set (0.00 sec)

[问题一]:为什么类型为bit(8)的10,没有显示出来呢?

​ bit字段是按照ASCLL码对应的字符显示的。在ASCLL码中10对应回车符,所以结果如果。我们插入65观察结果,65对应的ASCLL码即为65

mysql> use info;

Database changed
mysql> insert into t1 values(11, 65);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------+------+
| id   | b    |
+------+------+
|   10 | 
 |
|   11 | A    |
+------+------+
2 rows in set (0.00 sec)

​ 如果我们有这样的值,比如存储用户的性别。只需要存放0或1,这时可以定义bit(1),这样可以节省空间。

​ 现在尝试插入大于8比特位的数据(255)的数据,验证MySQL的约束作用。不出所料,我们的行为被直接终止了

mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| b     | bit(8)  | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into t1 values(12, 256);
ERROR 1406 (22001): Data too long for column 'b' at row 1

3.INT系列类型

注意点:

  1. 使用时注意选择合适的类型
  2. 可以通过 UNSIGNED 关键字来说明某个字段是无符号的,例如 age TINYINT UNSIGNED

4.浮点数类型

1)float与double

①基本语法

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

[说明]:

  • M指定数据的最长总位数,D指定数据的小数的最长位数
  • M与D也属于一种约束
  • double在精度上比float更高,使用上没什么区别

②案例

​ float(4, 2)表示的数据范围为 -99.99~99.99。mysql5.7版本中,在保存值时会四舍五入(不同版本可能不同)

mysql> create table t2(
    -> id int,
    -> f float(4, 2) 
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t2 values(1, 1.1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(1, 99.991);  -- 发生四舍
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(1, 99.995); -- 五入时溢出报错
ERROR 1264 (22003): Out of range value for column 'f' at row 1

mysql> select * from t2;
+------+-------+
| id   | f     |
+------+-------+
|    0 |  1.10 |
|    1 | 99.99 |
+------+-------+
2 rows in set (0.00 sec)

​ 如果指定类型为 float unsigned,那么数据范围就变成了 0 ~ 99.99,此时不存在四舍五入的问题,例如插入 -0.1就会失败:

mysql> create table t3(
    -> id int, 
    -> f float unsigned
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t3 values(1, 0);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t3 values(1, -0.1);
ERROR 1264 (22003): Out of range value for column 'f' at row 1
2.float与decimal

①基本语法

decimal(M, D) [unsigned] -- M指定显示长度,d指定小数位数,占用空间可变
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99
  • decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。 值得注意的是,decimal是变长的。

②float与decimal的区别:

​ DECIMAL 类型之所以准确,是因为它采用的是定点数表示方式,即将一个数表示为整数部分和小数部分的组合,而小数部分的位数是固定的,在创建表时就需要指定。例如,DECIMAL(10,2) 表示总共有 10 位数字,其中小数部分占 2 位,整数部分最多占 8 位。在内部存储时,DECIMAL 类型的数值会被精确地表示为 10 进制数字串。

​ 相比之下,FLOAT 和 DOUBLE 类型采用的是浮点数表示方式,即将一个数表示为尾数(mantissa)和指数(exponent)的乘积形式,其中尾数和指数都是用二进制表示的数值。由于浮点数的存储结构要求在表示大数时保证指数的大小范围,而尾数的精度会随着指数增长而下降。换言之,在表示大数时,尾数所能表示的有效位数变少,因此就会有一定的精度损失。浮点数在内存中的如何存储

-- 说明:float表示的小数精度大约是7位,decimal为30位
mysql> create table t4(
    -> f float(12, 10),
    -> d decimal(12, 10)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t4 values(1.1234567, 1.234567);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t4 values(1.12345678, 1.2345678);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t4 values(1.123456789, 1.23456789);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t4;
+--------------+--------------+
| f            | d            |
+--------------+--------------+
| 1.1234567165 | 1.2345670000 |
| 1.1234568357 | 1.2345678000 |
| 1.1234568357 | 1.2345678900 |
+--------------+--------------+
3 rows in set (0.00 sec)

​ 从上面我们可以看出,如果我们想存储精度更高的小数,则应该使用decimal类型

二、字符串类型

1.类型总览

image-20230425083631897

2.CHAR类型

①基本语法

char(L)-- 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
  • L表示的是字符集中的字符数量,而不是字节数量。例如char(2)既可以存储'UK'这两个英文字母,也可以存储'中国'这两个汉字,在utf8编码下,一个英文占用1字节,而存储一个中文需要3字节。
  • L的最大值为255

②使用案例:

mysql> create table t5(
    -> id int,
    -> name char(3)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t5 values(0, '唐僧');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t5 values(1, '孙悟空');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t5 values(0, '观音菩萨');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select * from t5;
+------+-----------+
| id   | name      |
+------+-----------+
|    0 | 唐僧      |
|    1 | 孙悟空     |
+------+-----------+
2 rows in set (0.00 sec)

3.VARCHAR类型

①基本语法

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

[说明]:

​ L同样表示最多存储的字符个数而非字节数。由于VARCHAR所能存储的最大字节长度为65535,因此当使用不同的字符集时,VARCHAR(n) 所能存储的最大字符数量也会不同:

  • 因为varchar数据类型占用长度是可变的,因此有1 - 3 个字节用于记录数据的长度信息,所以说有效字节数是65532。

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

②char与varchar的区别:

image-20230425092356260

(假设一个字符占3字节)

​ char 类型是一种固定长度的数据类型,因此如果定义的 char(n) 列中存储的字符串长度不满足 n,MySQL 会自动在其后面添加空格,直到满足定义的长度为止。

​ varchar类型是一种变长的数据类型,根据实际字符数分配空间。虽然长度上仍然是有上限的,但这和变长并不冲突。

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

  • 定长的磁盘空间比较浪费,但是效率高。
  • 变长的磁盘空间比较节省,但是效率低(长度字段的读取、更新等会降低效率)。
  • 定长的意义是,直接开辟好对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

三、日期与时间类型

①基础语法

常用的日期有如下三个:

  • date:日期格式为 yyyy-mm-dd ,共占用三字节。
  • datetime:时间日期格式 yyyy-mm-dd HH:ii:ss 占用八字节。可以表示从公元 1000 年 1 月 1 日 00:00:00 到公元 9999 年 12 月 31 日 23:59:59.9999999 的所有日期和时间。
  • timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss。格式和 datetime 完全一致,占用四字节 。

②案例:

mysql> create table t7(
    -> t1 date,
    -> t2 datetime,
    -> t3 timestamp
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t7(t1, t2) values('2023-4-25', '2023-4-25 12:14:30');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t7;
+------------+---------------------+---------------------+
| time1      | time2               | time3               |
+------------+---------------------+---------------------+
| 2023-04-25 | 2023-04-25 12:14:30 | 2023-04-25 12:15:18 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

特别说明:

​ timestamp是一种一种特殊的时间类型,不需要用户手动输入。在添加数据的时候,时间戳会根据当前操作的时间自动以yyyy-mm-dd HH:ii:ss的形式补上。同样的,当我们修改字段的数据时,时间戳也会自动修改:

mysql> update t7 set time1='2022-5-1';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t7;
+------------+---------------------+---------------------+
| time1      | time2               | time3               |
+------------+---------------------+---------------------+
| 2022-05-01 | 2023-04-25 12:14:30 | 2023-04-25 12:19:53 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

四、枚举类型

1.enum类型

①基本语法

enum('选项一','选项二','选项三'……)   -- 枚举类型,单选

说明:

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

②使用案例

mysql> create table t8(
    -> id int,
    -> sex enum('男','女')
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t8 values(0,'男');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t8 values(1,1);   -- 1就指代第一个选项
Query OK, 1 row affected (0.00 sec)

mysql> insert into t8 values(2,2);   -- 同理2指代第二个
Query OK, 1 row affected (0.01 sec)

mysql> select * from t8;
+------+------+
| id   | sex  |
+------+------+
|    0 ||
|    1 ||
|    2 ||
+------+------+
3 rows in set (0.00 sec)

2.set类型

①基本语法

set('选项一', '选型二', '选型三',……) -- 集合类型,多选

说明:

  • 该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值,即可以多选。

  • 出于效率考虑,单元格中实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32。在表示多个选项时则将数字相与,本质是使用位图进行状态压缩

    以三个选项为例,则选项一用 001表示 ,选项二用010 表示,选项三用100表示。表示一三选项的组合则将其相与,即101。

    不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

②使用案例

mysql> create table t9(
    -> id int,
    -> hobby set('爬山','游泳','篮球')
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t9 values(0, '爬山');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values(0, 1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values(1, '游泳,篮球');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values(1, 3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t9;
+------+---------------+
| id   | hobby         |
+------+---------------+
|    0 | 爬山           |
|    0 | 爬山           |
|    1 | 游泳,篮球      |
|    1 | 爬山,游泳      |
+------+---------------+
4 rows in set (0.00 sec)

3.在set中的查找

现有如下数据 :

+---------+----------------------+------+
| usrname | hobby                | sex  |
+---------+----------------------+------+
| 刘备    | 爬山,游泳,篮球         ||
| 关羽    | 爬山,游泳             ||
| 张飞    | 篮球                 ||
| 貂蝉    | 游泳                 ||
+---------+----------------------+------+

先要查找出所有喜欢游泳的人,使用如下语句查询:

mysql> select * from t10 where hobby='游泳';
+---------+--------+------+
| usrname | hobby  | sex  |
+---------+--------+------+
| 貂蝉     | 游泳   ||
+---------+--------+------+
1 row in set (0.00 sec) 

然而只有貂蝉被选出来了,但这显然是不合理的。刘备和关羽也喜欢游泳。

因此在集合中查询的时候,需要使用 find_in_set(sub,str_list) 函数

  • 如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
  • str_list 用逗号分隔的字符串。
mysql> select * from t10 where find_in_set('游泳', hobby);
+---------+----------------------+------+
| usrname | hobby                | sex  |
+---------+----------------------+------+
| 刘备     | 爬山,游泳,篮球         ||
| 关羽     | 爬山,游泳             ||
| 貂蝉     | 游泳                 ||
+---------+----------------------+------+
3 rows in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ONLYOFFICE协作空间是什么?

今天给大家带来一个好消息,ONLYOFFICE推出更安全的协作空间了,好多朋友看到这个标题不认识是什么,我也是,今天来给大家介绍一下。 什么是 ONLYOFFICE 协作空间 简单来说ONLYOFFICE协作空间是一个协同工作平台,帮助您更…

Unity3D:模拟器视图

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 模拟器视图 “模拟器”视图在模拟的移动设备上显示应用程序。使用它来查看应用程序与该设备的屏幕形状、分辨率和方向的显示方式。 模拟器视图的屏幕截图 使用模拟器视图 若要打开…

微服务学习——Docker

初识Docker 项目部署的问题 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题: 依赖关系复杂,容易出现兼容性问题开发、测试、生产环境有差异 Docker Docker如何解决依赖的兼容问题的? 将应用的Libs(函数库)、 Deps&#xf…

【软件测试】第1章 软件测试概述

系列文章目录 文章目录 系列文章目录前言第1章 软件测试概述1.1 软件、软件危机和软件工程1.1.1 基本概念1.1.2 软件工程的目标及其一般开发过程1.1.3 软件过程模型 1.2 软件缺陷与软件故障1.2.1 基本概念1.2.2 典型案例 1.3 软件测试的概念1.3.1 软件测试的定义1.3.2 软件测试…

2023全球运维大会 | 智能运维中的数据管理和数据探索

GOPS 全球运维大会由高效运维社区(GreatOPS)、开放运维联盟(OOPSA)和 DevOps 时代社区联合主办,指导单位为云计算开源产业联盟、FinOps产业推进方阵。迄今为止,GOPS 已经举行了十九次,大会参会嘉…

Docker网络与资源控制

目录 一、Docker网络 1.Docker网络模式 2.Docker网络实现的原理 3.映射端口 4.none模式 5.bridge模式 二、资源控制 1.CPU 资源控制 2.cgroups有四大功能: 一、Docker网络 1.Docker网络模式 ●Host:容器将不会虚拟出自己的网卡&am…

如何保护数据安全?企业该从部署SSL证书开始

数字化时代,大数据开始蔓延到各行各业,影响着生活的方方面面。在犹如“皇帝穿新衣”般透明的大数据时代,数据泄露无孔不入,存在问题层出不穷,未知的漏洞隐患、安全边界的模糊、新的网络攻击手段、个人隐私的无处藏身等…

音视频开发面试题大盘点:掌握这些基础知识,你就能轻松应对面试

前言 音视频开发作为一种高技术含量的领域,随着人们对数字媒体的需求不断增加,其前景非常广阔。预计在2023年,音视频开发领域仍将继续保持快速发展的态势,尤其是在移动互联网、物联网、虚拟现实、增强现实等领域。 根据BOSS招聘…

deepstream6.2更新的新特性-支持雷达lidar的推理检测

1,其实在deepstream6.1中已经加入了3D深度图像 其实在deepstream6.1中已经加入了3D深度图像,可以将深度图像的数据显示出来,但是需要专门的深度相机,官方给出的是Intel realSense D435相机,它可以读取相机数据,并进行点云显示以及渲染深度绘制,这个功能有点类似调用ope…

ES集群配置

一、高并发下如何保证读写一致 1.1 写操作 对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本…

centos集群上安装hive客户端的操作步骤以及hive介绍

系列文章目录 虚拟机centos7配置Hadoop单节点伪分布配置教程​​​​​​ hbase进阶操作——读流程与写流程介绍 HBase进阶——文件的合并、 MemStore Flush、StoreFile Compaction、 Region Split、高可用与预分区介绍 centos7虚拟机下hbase的使用案例讲解 文章目录 前言…

【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata

NacosSentinelSeata 9/9 1、SpringCloud Alibaba简介1.1 主要功能1.2 具体组件 2、SpringCloud Alibaba Nacos服务注册和配置中心2.1 Nacos介绍2.2 Nacos下载安装2.3 使用Nacos作为注册中心2.3.1 在父工程的pom文件中引入springcloudalibaba依赖2.3.2 创建cloudalibaba-provide…

面向对象(高级)-包装类的理解_基本数据类型、包装类、String类型间的转换及练习

包装类 大纲 包装类的使用 1.为什么要使用包装类? 为了使基本数据类型的变量具备引用数据类型变量的相关特征(比如:封装性、继承性、多态性)。我们给各个基本 数据类型的变量都提供了对应的包装类。2.(掌握&#xff…

Vue电商项目--项目路由

项目路由分析 vue-router 路由分为KV node平台(并非语言) 对于后台而言:K即为URL地址 V即为相应的中间件 前端路由: K即为URL(网络资源定位符) V即为相应的路由组件 路由的一个分析 确定项目结构顺序:上中下 -----只有中间部…

如何构建可靠的台账数据——详解台账管理系统的使用方法

随着数字化的发展,越来越多的企业开始采用电子台账管理,实现了对各项业务数据的及时准确保存和管理。而在台账管理应用中,发票管理、工单管理和库房台账是三大重要方面。下面我将详细介绍一下台账管理系统。 一、发票管理 1.收票台账报表 …

MySQL入门基础(一步一图)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

【数据结构】堆(二)

😛作者:日出等日落 📘 专栏:数据结构 把每天当作最后一天来过,那么你就能够学会珍惜。你珍惜了时间,时间自然会对你有所回报。 目录 🎄堆的创建: 堆排序: 向下调整的时…

【51单片机】按键操作(单个灯闪烁流水灯)

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔同一个灯 🏳️‍🌈效果…

怎么把png图片压缩到100k以内,3个工具高效处理

怎么把png图片压缩到100k以内?为什么要压缩图片呢?当我们在提交资料的时候,而系统却提示图片过大无法上传的情况,大多都限制100K以内,这个时候我们就需要压缩图片。当我们网站打开的速度很慢的时候,这个时候…

DevExpress:报表在winform窗体上显示(使用documentViewer控件)

一:控件认识 documentViewer(版本DX22.2),老版本中的可能是printControl(工具箱面板中可能找不到),通过官网搜索发现,这个控件现在继承于documentViewer这个控件。因此,使用documen…