【MySQL】(2)数据类型

news2024/11/27 15:34:09

文章目录

  • 数据类型分类
  • 数值类型
  • 文本、二进制类型
  • 日期和时间类型
  • String 类型

数据类型分类

MySQL 支持多种数据类型,大致可分为数值类型,文本、二进制类型,时间日期,String类型。

img

数值类型

类型字节有符号范围无符号范围
TINYINT1-128~1270~255
SMALLINT2-32,768~32,7670~65,535
MEDIUMINT3-8,388,608~8,388,6070~16,777,215
INT4-2,147,483,648~2,147,483,6470~4,294,967,295
BIGINT8-9,223,372,036,854,775,808~9,223,372,036,854,775,8070~18,446,744,073,709,551,615

以TINYINT为例

创建一个表 t1,其中包含一个有符号 TINYINT 类型的 num 列

create table t1(
	num tinyint
);

创建一个表 t2,其中包含一个无符号 TINYINT 类型的 num 列

create table t2(
	num tinyint unsigned
);

如果插入的数据超范围了,会报错:

img

BIT类型

BIT 是一种位数据类型,用于存储比特值(即 0 或 1)。BIT 数据类型在存储和检索单独的位序列时非常有用。它支持 BIT(M) 的形式,其中 M 指定要存储的位数。例如,BIT(1) 数据类型可以存储单个比特,而 BIT(8) 数据类型可以存储 8 个比特的位序列。BIT 类型还可以用于存储 IP 地址和网络地址等。

例1

创建一个表,其中包含一个bit(8)类型的字段a

img

10,255这样的数都可以插入,超过255的就不允许了

img

img

img

检索数据,发现显示有误

img

这是因为bit类型是以 ASCII 字符形式显示,10和255对应的都是特殊字符。

例2

如果你想存储一个二进制位的状态(例如是否已经完成某个任务),你可以使用bit类型来节省存储空间。例如,一个8位bit类型的列可以存储8个不同的状态,而需要一个tinyint类型的列来存储相同的8个状态需要更多的存储空间。同时,使用bit类型可以更方便地进行位运算操作,例如检查某一位是否为1。


float类型

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

下面创建一个包含字段类型 float(4,2) 的表。

img

我们发现,99.99、99.994 都可以正常插入,插入后显示的值都是99.99,因为99.994四舍五入后也是99.99,而99.995无法插入,因为它四舍五入后是100.00,位数超过4。

img

文本、二进制类型

char类型

固定长度字符串

char(size)

size 表示字符个数,一个汉字也算一个字符。

varchar类型

说明

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

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

例如,这里默认是 utf8 编码,要创建长度 21845 的 varchar 是不行的。

img

char 和 varchar 的区别

  1. 存储方式不同:varchar 存储可变长度的字符串,只占用必要的存储空间;而 char 存储固定长度的字符串,占用固定的存储空间,无论实际存储内容的长度是多少。
  2. 查询性能不同:由于 char 存储的字符串长度固定,所以在进行查询时,查询性能更高;而 varchar 在存储可变长度字符串时,由于要计算每行数据的实际长度,因此在查询时会比 char 略慢一些。
  3. 默认长度不同:对于 char 类型,如果在创建表时没有指定长度,MySQL 默认长度为1;而对于 varchar 类型,如果在创建表时没有指定长度,MySQL 默认长度为255。
  • char(m) 中的 m 表示固定长度的字符数,如果存储的字符串不足 m 长度,会用空格字符进行填充,占用空间为 m 个字符的存储空间
  • varchar(m) 中的 m 表示可变长度的字符数,即最多能存储多少个字符,如果存储的字符串长度小于等于 m,只会占用实际存储的长度空间,而不会占用 m 个字符的存储空间。

总的来说,如果存储的字符串长度固定,且数据表中的字段经常被用于查询,那么可以使用 char 类型;如果存储的字符串长度可变,或者数据表中的字段不经常用于查询,那么可以使用 varchar 类型。

日期和时间类型

  • date:日期,格式 yyyy-mm-dd,占用 3 字节
  • datetime:日期时间,格式 yyyy-mm-dd HH:ii:ss 表示范围从 1000 到 9999,占用 8 字节
  • timestamp:时间戳,占用 4 字节

创建一个表,包含 3 个字段,分别为 date datetime timestamp 类型。

img

我们发现,timestamp 的 Default 是 CURRENT_TIMESTAMP,Extra 是 on update CURRENT_TIMESTAMP

  • CURRENT_TIMESTAMP是MySQL中的一个函数,用于返回当前的时间戳(即当前日期和时间)。它可以用于创建表的时候指定一个默认值,也可以用于更新表的时候赋值。

  • on update CURRENT_TIMESTAMP是在一个DATETIMETIMESTAMP类型的字段上定义的属性,用于在这个字段所在的行被更新时,自动将该字段的值设置为当前时间戳。它可以用于确保每次更新这个行时,该字段都会被更新为当前时间戳。这个属性只能用于DATETIMETIMESTAMP类型的字段。

所以我们插入数据的时候,不需要指定 timestamp 类型的列的值。

img

String 类型

enum 和 set 的区别就是,enum 是单选,set 是多选。

语法

-- enum
enum('选项1','选项2','选项3',...);

-- set
set('选项1','选项2','选项3',...);

在 MySQL 中,ENUM 和 SET 类型的字段实际上是整数类型的字段,只不过这些整数是对应特定的字符串值的。对于 ENUM 类型,每个字符串值都对应一个整数值,整数值的范围是 1 1 1 N N N,其中 N N N 是 ENUM 中字符串值的数量;对于 SET 类型,每个字符串值也都对应一个整数值,但整数值是一个二进制位标志,范围是 0 0 0 2 N − 1 2^N-1 2N1,其中 N N N 是 SET 中字符串值的数量,选项从左到右代表二进制位从低位到高位。

创建一个名为 t1 的表,包含三个字段:id、gender 和 hobbies,gender 字段的取值只能是 ‘male’ 或 ‘female’,hobbies 字段的取值可以是 ‘reading’、‘music’、‘sports’ 中的任意组合,例如 ‘reading,music’、‘sports’、‘reading,music,sports’ 等。

CREATE TABLE t1 (
    id INT,
    gender ENUM('male', 'female'),
    hobbies SET('reading', 'music', 'sports')
);

向表中插入信息:

INSERT INTO t1 (id, gender, hobbies) VALUES
(1, 'male', 'reading,music'),
(2, 'female', 'music,sports'),
(3, 'male', 'reading,sports');

genter 和 hobbies 字段也可以使用数字来插入

INSERT INTO t1 (id, gender, hobbies) VALUES
(4, 2, 7), -- 'female', 'reading,music,sports'
(5, 1, 1), -- 'male', 'reading'
(6, 2, 2); -- 'female', 'music'

插入结果:

MariaDB [test_db]> select * from t1;
+------+--------+----------------------+
| id   | gender | hobbies              |
+------+--------+----------------------+
|    1 | male   | reading,music        |
|    2 | female | music,sports         |
|    3 | male   | reading,sports       |
|    4 | female | reading,music,sports |
|    5 | male   | reading              |
|    6 | female | music                |
+------+--------+----------------------+
6 rows in set (0.00 sec)

我们可以使用数字或选项筛选 gender 为 male 的信息

MariaDB [test_db]> select * from t1 where gender='male';
+------+--------+----------------+
| id   | gender | hobbies        |
+------+--------+----------------+
|    1 | male   | reading,music  |
|    3 | male   | reading,sports |
|    5 | male   | reading        |
+------+--------+----------------+
3 rows in set (0.00 sec)

MariaDB [test_db]> select * from t1 where gender=1;
+------+--------+----------------+
| id   | gender | hobbies        |
+------+--------+----------------+
|    1 | male   | reading,music  |
|    3 | male   | reading,sports |
|    5 | male   | reading        |
+------+--------+----------------+
3 rows in set (0.00 sec)

我们也可以使用 were 对 hobbies 进行筛选

MariaDB [test_db]> select * from t1 where hobbies='music';
+------+--------+---------+
| id   | gender | hobbies |
+------+--------+---------+
|    6 | female | music   |
+------+--------+---------+
1 row in set (0.00 sec)

由于 = 是严格匹配,所以筛选出的是“hobbies 仅为 ‘music’ 的信息”。

要筛选出所有包含 ‘music’ 的信息,需要用到函数

集合查询使用 find_in_set 函数

语法

FIND_IN_SET(str, strlist)

str是要查找的字符串

strlist是逗号分隔的字符串列表。

返回 strstrlist 中的位置(下标从 1 开始),如果 str 不在 strlist 中,则返回 0

例如,以下查询返回值为2,因为"apple"在字符串列表"orange,apple,banana"中的第二个位置:

SELECT FIND_IN_SET('apple', 'orange,apple,banana');

注意FIND_IN_SET()函数区分大小写。如果在不区分大小写的情况下查找字符串,则应使用LOWER()UPPER()函数将查询字符串和列表字符串都转换为相同的大小写格式,以避免大小写造成的误匹配。

查询 hobbies 有 music 的人:

img

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

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

相关文章

01 |「ChatGPT」简介

前言 ChatGPT 科普。 文章目录 前言一、ChatGPT 介绍1. ChatGPT 是什么2. ChatGPT 有哪些应用二、相关文献一、ChatGPT 介绍 登录网址:https://chat.openai.com/auth/login 1. ChatGPT 是什么 ChatGPT 是一个大型语言模型,由 OpenAl 公司训练,并基于 GPT-3.5 架构构建;它可…

java设计模式(2)单例模式、工厂模式、原型模式、建造者模式

用pr设计的图片,当封面不错 单例模式 单例对象的类必须保证只有一个实例存在 饿汉式单例 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的 //饿汉式单例类. public class Singleton {//构…

tmall.item.sizemapping.template.create( 新增天猫商品尺码表模板 )

¥开放平台免费API必须用户授权 新增天猫商品尺码表模板 男鞋、女鞋、运动鞋、户外鞋类目,尺码表维度为: 脚长(cm) 必选 内衣-文胸类目,尺码表维度为: 上胸围(cm) 必选 …

机器学习入门实例-MNIST手写数据集-简单探索二分分类

MNIST数据集介绍 MNIST数据集包含7w张带标签的手写数字图片。每次有新的分类算法出现时,常常会在改数据集测试效果。 from sklearn.datasets import fetch_openml# 获取的mnist是一个字典 mnist fetch_openml(mnist_784, version1) print(mnist.keys()) # dict_k…

Hutool-crypto 加密、解密详解!

1. 介绍 在Java开发的过程中,很多场景下都需要加密解密。 比如对敏感数据的加密,对配置文件信息的加密,通信数据的加密等等。 今天介绍的是Hutool工具包中的加密模块 crypto。 2. 加密分类 加密分为三类: 对称加密&#xff0…

Embarcadero RAD Studio Crack

Embarcadero RAD Studio Crack RAD Studio(r)是一款终极IDE,用于使用Delphi(r)、现代C和适用于Windows 11的高级Windows桌面UI库为多个平台创建单源原生应用程序,它为IDE添加了高DPI支持。这使得开发人员可以在更大的屏幕上以更高的分辨率工作。IDE现在支…

在VS和g++下的string结构的区别

文章目录1. 在VS下的结构2.在gcc下的结构3.写时拷贝/共享内存在之前的时间里&#xff0c;我们学习了string类的使用和模拟实现&#xff0c;但是在VS和g下使用string&#xff0c;发现了一点问题&#xff0c;下面我们通过一段代码来重现一下这个问题#include <iostream> #i…

融合DE 端和FE端数据,利用小波变换生成时频图,再分别利用DCNN、KNN和DNN进行对比实验(python代码)

1.数据集介绍&#xff1a; 试验台如图所示&#xff0c;试验台左侧有电动机&#xff0c;中间有扭矩收集器&#xff0c;右侧有动力测试仪&#xff0c;控制电子设备在图中没有显示。SKF6203轴承使用16通道数据采集卡采集轴承的振动数据&#xff0c;并在驱动端部分&#xff08;DE&…

AI模型训练、实施工程师的职业前景怎么样?

本篇文章主要讲解ai模型训练、模型实施工程师的职业前景和趋势分析 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月18日 ai训练师、模型实施工程师&#xff0c;一般是指opencv、pytorh、python、java、机械学习、深度学习、图像识别、视频检测等领域的模型数据训练工作。 …

07 - 深度学习处理器架构⭐⭐⭐⭐

架构设计需要解决的两个主要问题:(1)如何提高处理器的能效比(性能/功耗)- 硬化算法(2)如何提高处理器的可编程性(通用性) - CPU 一、单核深度学习处理器(DLP-S) 1. 总体架构 (1)架构图 DMA是一种硬件机制,允许外围组件将其I/O数据直接传输到主存储器中,而无需…

CentOS 8 手动安装MongoDB

文章目录1. MongoDB概述2. 安装MongoDB2.1 在MongoDB官网选择对应版本2.2 去到MongoDB安装目录&#xff0c;并下载MongoDB安装包2.3 解压MongoDB安装包2.4 重命名解压后的MongoDB文件夹名2.5 创建MongoDB数据库数据存放路径2.6 创建MongoDB日志文件存放路径2.7 进入MongoDB文件…

Pixhawk基础—认识Pixhawk

Pixhawk简介 pixhawk是由3DR联合APM小组与PX4小组于2014年推出的飞控PX4的升级版&#xff0c;它同时拥有PX4和APM两套固件和相应的地面站软件。该飞控是目前全世界飞控产品中硬件规格最高的产品。 Pixhawk基础 端口介绍 1、Spektrum DSM receiver(Spektrum DSM信号转换为PWM…

Java基础总结(一)

文章目录前言封装继承多态抽象方法接口内部类static权限修饰符this superprivate关键字final关键字就近原则构造方法号StringBuilderStringJoiner字符串原理总结&#xff1a;1、字符串存储的内存原理2、号比较的是什么&#xff1f;3、字符串拼接的底层原理4、StringBuilder提高…

ASIC-WORLD Verilog(1)一日Verilog

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…

Java反射面试总结(二)

为什么引入反射概念&#xff1f;反射机制的应用有哪些&#xff1f; 我们来看一下 Oracle 官方文档中对反射的描述&#xff1a; 从 Oracle 官方文档中可以看出&#xff0c;反射主要应用在以下几方面&#xff1a; 反射让开发人员可以通过外部类的全路径名创建对象&#xff0c;…

详解C语言结构体内存对齐:你知道如何快速计算结构体大小吗?

本篇博客会讲解C语言结构体的内存对齐&#xff0c;并且给出一种快速计算结构体大小的方式。主要讲解下面几点&#xff1a; 结构体的内存对齐是什么&#xff1f;如何快速计算结构体的大小&#xff1f;如何利用内存对齐节省结构体占用的内存空间&#xff1f;为什么结构体要内存对…

分布式数据库架构路线大揭秘

文章目录分布式数据库是如何演进的&#xff1f;数据库与分布式中间件有什么区别&#xff1f;如何处理分布式事务&#xff0c;提供外部一致性&#xff1f;如何处理分布式SQL&#xff1f;如何实现分布式一致性&#xff1f;数据库更适合金融政企的未来这些年大家都在谈分布式数据库…

MySQL-中间件mycat(一)

目录 &#x1f341;mycat基础概念 &#x1f341;Mycat安装部署 &#x1f343;初始环境 &#x1f343;测试环境 &#x1f343;下载安装 &#x1f343;修改配置文件 &#x1f343;启动mycat &#x1f343;测试连接 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f9…

边缘网关thingsboard-gateway DTU902

thingsboard-gateway是一个采用python语言编写的开放源代码网关程序&#xff0c;用于将传统或第三方系统的设备与thingsboard平台连接。 支持 采集Modbus slaves、CAN、MQTT 、OPC-UA servers, Sigfox Backend。 除了具备普通 网关外&#xff0c;还具备可配置的边缘能力&…

rabbitmq深入实践

生产者&#xff0c;交换机&#xff0c;队列&#xff0c;消费者 交换机和队列通过 rounting key 绑定者&#xff0c;rounting key 可以是#.,*.这类topic模式&#xff0c; 生产者发送消息内容 rountingkey&#xff0c; 到达交换机后交换机检查与之绑定的队列&#xff0c; 如果能匹…