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

【MySQL】数据类型(二)

文章目录

  • 一. char字符串类型
  • 二. varchar字符串类型
    • 2.1 char和varchar比较
  • 三. 日期和时间类型
  • 四. enum和set类型
    • 4.1 set的查询
  • 结束语

在这里插入图片描述

一. char字符串类型

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

MySQL中的字符,和C/C++,Java的有所不同
我们认为的字符,是一个字节,但在MySQL中字符就是字符
我们做如下实验

mysql> create table char_test(-> id int,-> name char(2)-> );
Query OK, 0 rows affected (0.03 sec)mysql> insert into char_test values (1,'ab');
Query OK, 1 row affected (0.00 sec)mysql> insert into char_test values (1,'abc');
ERROR 1406 (22001): Data too long for column 'name' at row 1mysql> insert into char_test values (1,'中国');
Query OK, 1 row affected (0.00 sec)mysql> insert into char_test values (1,'中国人');
ERROR 1406 (22001): Data too long for column 'name' at row 1

虽然汉字在utf8中占用3个字节,在gbk中占用2个字节,但是在char(2)中,中国也可以成功插入

二. varchar字符串类型

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

mysql> create table varchar_test(-> id int,-> ch varchar(6)-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into varchar_test values (1,'hello');
Query OK, 1 row affected (0.00 sec)mysql> insert into varchar_test values (1,'我爱你,中国');
Query OK, 1 row affected (0.00 sec)

对于varchar(len),len的最大值与表的编码密切相关

len表示最大字符个数,varchar最大存储65535个字节。但是varchar的前1~3个字节需要用于记录数据大小。所以最大字节数是65532。
如果是utf8编码,一个字符占用3个字节,那么len最大是21844
如果是gbk,一个字符占用2个字节,那么len最大是32766

在创建表时,默认大小是不算记录数据长度的字节数的
实验如下:

mysql> create table varchar_test2( name varchar(21844) );
Query OK, 0 rows affected (0.02 sec)mysql> create table varchar_test3( name varchar(21845) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

还需注意,MySQL一行数据也有限制长度,即所有属性字节总数之和有最大值

mysql> create table varchar_test4( id int,name varchar(21844) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

2.1 char和varchar比较

varchar是变长字符串,char是固定字符串

在这里插入图片描述
如果字符长度远小于len,那么varchar只有占用插入数据的长度,而char是固定len长度

如何选择varchar或者char

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号
  • 如果数据长度有变化,就使用变长(varchar),比如:名字,地址
  • 定长的磁盘空间比较浪费,但是效率高,不用扩容,维护数据长度
  • 变长的磁盘空间比较节省,但是效率低
  • 定长的意义是,直接开辟号对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

三. 日期和时间类型

常用的日期有如下三个

  • date:日期 格式:yyyy-mm-dd 占用三个字节
  • datetime: 时间日期 格式:yyyy-mm-dd HH:ii:ss 年份表示范围从1000~9999,占用八个字节
  • timestamp:时间戳,从1970年开始 格式:yyyy-mm0dd HH:ii:ss 与datetime完全一致,占用四个字节
//创建表
mysql> create table date_test(-> date1 date,-> date2 datetime,-> date3 timestamp-> );
Query OK, 0 rows affected (0.03 sec)//显示表的信息
mysql> desc date_test;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| date1 | date      | YES  |     | NULL              |                             |
| date2 | datetime  | YES  |     | NULL              |                             |
| date3 | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)

需要注意的是,timestamp时间戳,不允许为空,并且有默认值

//插入数据
mysql> insert into date_test (date1,date2)  values ('2000-10-01','2003-12-01 14:00:00');
Query OK, 1 row affected (0.00 sec)mysql> select * from date_test;
+------------+---------------------+---------------------+
| date1      | date2               | date3               |
+------------+---------------------+---------------------+
| 2000-10-01 | 2003-12-01 14:00:00 | 2023-09-28 11:46:55 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

添加数据时,时间戳自动补上当前时间

on update CURRENT_TIMESTAMP表示在修改时,时间戳会自动更新为当前时间

mysql> update date_test set date1='2002-10-01';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from date_test;
+------------+---------------------+---------------------+
| date1      | date2               | date3               |
+------------+---------------------+---------------------+
| 2002-10-01 | 2003-12-01 14:00:00 | 2023-09-28 11:51:00 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

四. enum和set类型

enum是枚举类型,选项可以是多个,但插入数据时只能选择其中一个
enum('选项一',‘选项二’,'选项三'...)

set是集合类型,选项可以是多个,插入数据也可以是多个
set('选项一','选项二','选项三'...)

//创建如下表
mysql> create table person(-> name varchar(8),-> gender enum('男','女'),-> hobby set('篮球','足球','音乐','羽毛球','游泳')-> );+--------+-------------------------------------------------+------+-----+-------+-----+
| Field  | Type                                         | Null | Key | Default | Extra |
+--------+-------------------------------------------------+------+-----+---- --+-----+
| name   | varchar(8)                                   | YES  |     | NULL    |       |
| gender | enum('男','女')                               | YES  |     | NULL    |       |
| hobby  | set('篮球','足球','音乐','羽毛球','游泳')        | YES  |     | NULL    |       |
+--------+-------------------------------------------------+------+-----+-------+-----+

enum类型在插入数据时,只能选择其中一个插入,且也只能选择选项有的数据

mysql> insert into person values ('张三','男','篮球');
Query OK, 1 row affected (0.01 sec)mysql> insert into person values ('张三','男,女','篮球');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> insert into person values ('张三','沃尔玛购物袋','篮球');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1

同时,enum类型支持按下标插入,注意下标从1开始

mysql> insert into person values ('李铁柱',1,'篮球');
Query OK, 1 row affected (0.00 sec)mysql> insert into person values ('田二妞',2,'游泳');
Query OK, 1 row affected (0.00 sec)mysql> select * from person;
+-----------+--------+--------+
| name      | gender | hobby  |
+-----------+--------+--------+
| 张三      || 篮球   |
| 李铁柱    || 篮球   |
| 田二妞    || 游泳   |
+-----------+--------+--------+

set类型在插入数据时,可以选择多个

mysql> insert into person values ('李四','男','篮球,音乐,羽毛球');
Query OK, 1 row affected (0.01 sec)

set类型也支持使用数字插入,但是不同于enum的下标,set使用比特位插入
hobby有五个选项,即00000,哪一位为1,代表插入哪一位的数据

set('篮球','足球','音乐','羽毛球','游泳')
mysql> insert into person values ('王五','男',3);
mysql> insert into person values ('赵六','男',7);
mysql> insert into person values ('孙七','女',31);王五       || 篮球,足球                          |
| 赵六      || 篮球,足球,音乐                      |
| 孙七      || 篮球,足球,音乐,羽毛球,游泳            |

3 --> 00011;7 --> 00111;31 --> 11111

4.1 set的查询

当前表数据如下:

+-----------+--------+---------------------------------------+
| name      | gender | hobby                                 |
+-----------+--------+---------------------------------------+
| 张三      || 篮球                                    |
| 李铁柱    || 篮球                                    |
| 田二妞    || 游泳                                    |
| 李四      || 篮球,音乐,羽毛球                          |
| 王五      || 篮球,足球                                |
| 赵六      || 篮球,足球,音乐                           |
| 孙七      || 篮球,足球,音乐,羽毛球,游泳                 |
+-----------+--------+---------------------------------------+

如果我们想查询有哪些人的爱好是篮球

mysql> select * from person where hobby='篮球';
+-----------+--------+--------+
| name      | gender | hobby  |
+-----------+--------+--------+
| 张三      || 篮球   |
| 李铁柱    || 篮球   |
+-----------+--------+--------+

虽然有查到,但是显示的是hobby只有篮球的。
如果我们想要查找hobby里有篮球的人,如何查询呢?

我们需要使用find_in_set函数

find_in_set(sub,str_list)在str_list中查找sub。注意sub只能是单个数据

比如:

mysql> select find_in_set('b','a,b,c');
+--------------------------+
| find_in_set('b','a,b,c') |
+--------------------------+
|                        2 |
+--------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('a,b','a,b,c');
+----------------------------+
| find_in_set('a,b','a,b,c') |
+----------------------------+
|                          0 |
+----------------------------+
1 row in set (0.00 sec)

find_in_set函数返回的是sub在str_list中的下标,从1开始,不存在返回0
运用在集合查询中是这样的

//查询一个
//含有足球
mysql> select * from person where find_in_set('足球',hobby);
+--------+--------+---------------------------------------+
| name   | gender | hobby                                 |
+--------+--------+---------------------------------------+
| 王五   || 篮球,足球                             |
| 赵六   || 篮球,足球,音乐                        |
| 孙七   || 篮球,足球,音乐,羽毛球,游泳            |
+--------+--------+---------------------------------------+//查询多个
//既含有足球,又含有羽毛球
mysql> select * from person where find_in_set('足球',hobby) and find_in_set('羽毛球',hobby);
+--------+--------+---------------------------------------+
| name   | gender | hobby                                 |
+--------+--------+---------------------------------------+
| 孙七   || 篮球,足球,音乐,羽毛球,游泳            |
+--------+--------+---------------------------------------+
1 row in set (0.00 sec)

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

相关文章:

【MySQL】数据类型(二)

文章目录 一. char字符串类型二. varchar字符串类型2.1 char和varchar比较 三. 日期和时间类型四. enum和set类型4.1 set的查询 结束语 一. char字符串类型 char (L) 固定长度字符串 L是可以存储的长度,单位是字符,最大长度是255 MySQL中的字符&#xff…...

基于Matlab实现连续模型求解方法

本文介绍了如何使用Matlab实现连续模型求解方法。首先,我们介绍了连续模型的概念,并明确了使用ODE和PDE求解器来求解常微分方程和偏微分方程的步骤。然后,我们通过一个简单的例子演示了如何将问题转化为数学模型,并使用Matlab编写…...

Tomcat 与 JDK 对应版本关系

对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法: 登陆Tomcat官网:Apache Tomcat - Welcome! 结果:...

iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone

文章目录 一、环境准备1.1、软件环境1.2、硬件环境1.3、查看版本 二、安装WDA过程2.7、构建失败,这类错误有很多,比如在选择开发者账号后,就会提示:Failed to register bundle identifier表示应用唯一注册失败2.9、第二个错误,完全…...

IDEA的Maven换源

前言 IDEA是个好东西,但是使用maven项目时可能会让人很难受,要么是非常慢,要么直接下载不了。所以我们需要给IDEA自带maven换源,保证我们的下载速度。 具体操作 打开IDEA安装路径,然后打开下面的文件夹 plugins\m…...

步进电机只响不转

我出现问题的原因是相位线接错。 我使用的滑台上示17H的步进电机,之前用的是57的步进电机。 57步进电机的相位线是A黑、A-绿、B红、B-蓝。 17步进电机的相位线是A红、A-绿、B黑、B-蓝。 这两天被一个问题困扰了好久,在调试步进电机开发板的时候电机发生…...

使用select实现服务器并发

select函数介绍&#xff1a; select 函数是一个用于在一组文件描述符上进行异步I/O多路复用的系统调用。它可以同时监视多个文件描述符&#xff0c;等待其中任何一个文件描述符准备就绪&#xff0c;然后进行相应的操作。 以下是select函数的原型&#xff1a; #include <…...

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频&#xff1a; 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…...

力扣 -- 718. 最长重复子数组

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m nums1.size();int n nums2.size();//多开一行&#xff0c;多开一列vector<vector<int>> dp(m 1, ve…...

MP、MybatisPlus、联表查询、自定义sql、Constants.WRAPPER、ew (二)

描述&#xff1a; 给定一个id列表&#xff0c;更新对应列表中动物的年龄&#xff0c;使得年龄都较少一岁。 要求&#xff1a;使用条件构造器构造条件。 mapper&#xff1a; void updateAnimalAge(Param(Constants.WRAPPER) Wrapper<Animal> wrapper, Param("age&qu…...

Ubuntu服务器安全性提升:修改SSH默认端口号

在Ubuntu服务器上&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种至关重要的远程连接工具。它提供了一种安全的方式来远程连接和管理计算机系统&#xff0c;通过加密通信来确保数据的保密性和完整性。SSH协议广泛用于计算机网络中&#xff0c;用于远程管理、文件传…...

十七,IBL-打印各个Mipmap级别的hdr环境贴图

预滤波环境贴图类似于辐照度图&#xff0c;是预先计算的环境卷积贴图&#xff0c;但这次考虑了粗糙度。因为随着粗糙度的增加&#xff0c;参与环境贴图卷积的采样向量会更分散&#xff0c;导致反射更模糊&#xff0c;所以对于卷积的每个粗糙度级别&#xff0c;我们将按顺序把模…...

7、Docker网络

docker网络模式能干嘛&#xff1f; 容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响 docker 网络模式采用的是桥接模式&#xff0c;当我们创建了一个容器后docker网络就会帮我们创建一个虚拟网卡&#xff0c;这个虚拟网卡和我们的容器网…...

MySQL学习笔记23

逻辑备份&#xff1a; 1、回顾什么是逻辑备份&#xff1f; 逻辑备份就是把数据库、数据表或者数据进行导出&#xff0c;导出到一个文本文件中。 2、逻辑备份工具&#xff1a; mysqldump&#xff1a;提供全库级、数据库级别以及表级别的数据备份。 mysqldumpbinlog&#xff…...

Java基础---第十篇

系列文章目录 文章目录 系列文章目录一、说说Java 中 IO 流二、 Java IO与 NIO的区别(补充)三、java反射的作用于原理一、说说Java 中 IO 流 Java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色…...

NLP 03(LSTM)

一、LSTM LSTM (Long Short-Term Memory) 也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比&#xff1a; 能够有效捕捉长序列之间的语义关联缓解梯度消失或爆炸现象 LSTM的结构更复杂,它的核心结构可以分为四个部分去解析: 遗忘门、输入门、细胞状态、输出门 LSTM内部结构…...

Python集成开发环境(IDE):WingPro for Mac

WingPro for Mac是一款Python集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;它提供了一系列强大的工具和功能&#xff0c;帮助Python开发人员提高开发效率和质量。 WingPro for Mac拥有直观的用户界面和强大的调试器&#xff0c;可以帮助用户快速定位问题和修复错误…...

[Machine learning][Part3] numpy 矢量矩阵操作的基础知识

很久不接触数学了&#xff0c;machine learning需要用到一些数学知识&#xff0c;这里在重温一下相关的数学基础知识 矢量 矢量是有序的数字数组。在表示法中&#xff0c;矢量用小写粗体字母表示。矢量的元素都是相同的类型。例如&#xff0c;矢量不包含字符和数字。数组中元…...

【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(上)

一、通知概述 通知简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知常见的使用场景&#xff1a; 显示接收到的短消息、即时消息等。显示应用的推送消息&#xff0c;如广告、版本更新等。显示…...

喜讯 | 怿星科技获评SAE“优秀核心零部件企业”,测试软件平台工具广受赞誉

2023年9月22日-23日&#xff0c;SAE 2023汽车智能与网联技术国际学术会议成功举行。此次学术会议由SAE International与南昌智能新能源汽车研究院联合主办&#xff0c;大会汇聚了来自国内外智能网联领域的顶尖专家和学者。大会同期颁布的奖项旨在向行业推选出更多新时代涌现的杰…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...