【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中的字符ÿ…...
基于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函数介绍: select 函数是一个用于在一组文件描述符上进行异步I/O多路复用的系统调用。它可以同时监视多个文件描述符,等待其中任何一个文件描述符准备就绪,然后进行相应的操作。 以下是select函数的原型: #include <…...
【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作
【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频: 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…...
力扣 -- 718. 最长重复子数组
解题步骤: 参考代码: class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m nums1.size();int n nums2.size();//多开一行,多开一列vector<vector<int>> dp(m 1, ve…...
MP、MybatisPlus、联表查询、自定义sql、Constants.WRAPPER、ew (二)
描述: 给定一个id列表,更新对应列表中动物的年龄,使得年龄都较少一岁。 要求:使用条件构造器构造条件。 mapper: void updateAnimalAge(Param(Constants.WRAPPER) Wrapper<Animal> wrapper, Param("age&qu…...
Ubuntu服务器安全性提升:修改SSH默认端口号
在Ubuntu服务器上,SSH(Secure Shell)是一种至关重要的远程连接工具。它提供了一种安全的方式来远程连接和管理计算机系统,通过加密通信来确保数据的保密性和完整性。SSH协议广泛用于计算机网络中,用于远程管理、文件传…...
十七,IBL-打印各个Mipmap级别的hdr环境贴图
预滤波环境贴图类似于辐照度图,是预先计算的环境卷积贴图,但这次考虑了粗糙度。因为随着粗糙度的增加,参与环境贴图卷积的采样向量会更分散,导致反射更模糊,所以对于卷积的每个粗糙度级别,我们将按顺序把模…...
7、Docker网络
docker网络模式能干嘛? 容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响 docker 网络模式采用的是桥接模式,当我们创建了一个容器后docker网络就会帮我们创建一个虚拟网卡,这个虚拟网卡和我们的容器网…...
MySQL学习笔记23
逻辑备份: 1、回顾什么是逻辑备份? 逻辑备份就是把数据库、数据表或者数据进行导出,导出到一个文本文件中。 2、逻辑备份工具: mysqldump:提供全库级、数据库级别以及表级别的数据备份。 mysqldumpbinlogÿ…...
Java基础---第十篇
系列文章目录 文章目录 系列文章目录一、说说Java 中 IO 流二、 Java IO与 NIO的区别(补充)三、java反射的作用于原理一、说说Java 中 IO 流 Java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色…...
NLP 03(LSTM)
一、LSTM LSTM (Long Short-Term Memory) 也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比: 能够有效捕捉长序列之间的语义关联缓解梯度消失或爆炸现象 LSTM的结构更复杂,它的核心结构可以分为四个部分去解析: 遗忘门、输入门、细胞状态、输出门 LSTM内部结构…...
Python集成开发环境(IDE):WingPro for Mac
WingPro for Mac是一款Python集成开发环境(IDE)软件,它提供了一系列强大的工具和功能,帮助Python开发人员提高开发效率和质量。 WingPro for Mac拥有直观的用户界面和强大的调试器,可以帮助用户快速定位问题和修复错误…...
[Machine learning][Part3] numpy 矢量矩阵操作的基础知识
很久不接触数学了,machine learning需要用到一些数学知识,这里在重温一下相关的数学基础知识 矢量 矢量是有序的数字数组。在表示法中,矢量用小写粗体字母表示。矢量的元素都是相同的类型。例如,矢量不包含字符和数字。数组中元…...
【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(上)
一、通知概述 通知简介 应用可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。 通知常见的使用场景: 显示接收到的短消息、即时消息等。显示应用的推送消息,如广告、版本更新等。显示…...
喜讯 | 怿星科技获评SAE“优秀核心零部件企业”,测试软件平台工具广受赞誉
2023年9月22日-23日,SAE 2023汽车智能与网联技术国际学术会议成功举行。此次学术会议由SAE International与南昌智能新能源汽车研究院联合主办,大会汇聚了来自国内外智能网联领域的顶尖专家和学者。大会同期颁布的奖项旨在向行业推选出更多新时代涌现的杰…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
