【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与南昌智能新能源汽车研究院联合主办,大会汇聚了来自国内外智能网联领域的顶尖专家和学者。大会同期颁布的奖项旨在向行业推选出更多新时代涌现的杰…...
基于Java的医院预约挂号系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
福利!这两款我自制的免费配色工具你领到了吗?
前两天刚入职,还没干过啥活儿,就迎来了中秋3天国庆7天总共8天的假期,美滋滋。 在这么喜庆的日子里,我觉得大家应该也无心科研,所以不如给大家发点儿福利,继续乐呵乐呵。 当然,说是福利&…...
Docker 网桥、docker0 网桥和 --net host:平台差异、使用方式和场景介绍简介:
Docker 是一个流行的容器化平台,它提供了不同的网络配置选项。其中,Docker 网桥、docker0 网桥和 --net host 是常见的网络部署方式。本文将介绍这些网络选项的平台差异、使用方式以及适用的场景。 Docker 网桥 (Bridge Networking):Docker 网桥是 Docker 默认的网络模式。在…...
【深度学习】系统架构工具链的学习笔记
1. 数据管理 数据版本控制和数据包管理:Activeloop Note: Scale Nucleus:其GitHub(nucleus-python-client)的stars数量少于 Deep Lake。Quilt:其GitHub(quilt)的stars数量少于 Deep Lake。...
Linux 网络编程
套接字(Socket): 通过网络实现跨机通信 作用:一种文件描述符传输层的文件描述符 整个编程中,需要着重注意htonl/htons、ntohl/ntohs、inet_addr等 TCP的C/S实现 循环服务器模型 TCP服务器实现过程 1.创建套接字&a…...
SpringBoot读取配置的方式
在 Spring Boot 应用中,我们通常需要一些配置信息来指导应用的运行。这些配置信息可以包括如下内容:端口号、数据库连接信息、日志配置、缓存配置、认证配置、等等。Spring Boot 提供了多种方式来读取这些配置信息。读取配置的目的是为了在程序中使用这些…...
c# winform程序,DispatcherTimer被调用延迟,响应间隔长
c# winform程序,DispatcherTimer被调用延迟,响应间隔长 最近修改的问题,winform界面上两个控件的数据刷新,用DispatcherTimer定时刷新,但是在某些机器上的实际刷新时间间隔远远大于设置时间。 既然MSDN已经说了&…...
【智能家居项目】裸机版本——项目介绍 | 输入子系统(按键) | 单元测试
🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀项目简介🏀输入子系统(按键)⚽应用层⚽设备层⚽ 内核层抽象层⚽…...
算法练习8——有序三元组中的最大值
LeetCode 100088 有序三元组中的最大值 I LeetCode 100086 有序三元组中的最大值 II 给你一个下标从 0 开始的整数数组 nums 。 请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数&am…...
git创建
问: git remote add origin https://github.com//blog.git fatal: not a git repository (or any of the parent directories): .git 回答: 这个错误提示指出当前目录或其父目录中不存在.git文件夹,因此无法执行git相关操作。请确保你是在一个已经初始化为git仓库…...
免费b2b电子商务网/宁波seo免费优化软件
临时研究了下机器视觉两个基本算法的算法原理 ,可能有理解错误的地方,希望发现了告诉我一下 主要是了解思想,就不写具体的计算公式之类的了 (一) ICP算法(Iterative Closest Point迭代最近点) I…...
网站建设技术标准/百度百科优化排名
<script type"text/javascript">//Dom对象不能使用Jquery对象的方法//Jquery对象也不能使用Dom对象的方法//Dom对象转Jquery对象$(function () {var Dom1 document.getElementById(div1);var s $(Dom1).html();alert(s);});//Jquery对象转Dom对象$(function …...
扫码进入网站如何做/广西seo公司
Libvirt-Manager这是一个简单的 Libvirt 虚拟机管理器,使用 PHP 开发。它可以启动、关闭、强制结束或读取虚拟机信息,列出虚拟机列表等。这个项目是为了让开发者管理虚拟机更简单,更轻松。你需要安装 PHP_SSH2 模块来使用此管理器。唔...第一…...
小程序推广app/网络推广seo
简单工厂模式:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族…...
wordpress服务器要求/北京网站排名seo
在外部类中调用某一个实例的成员方法的方式: 1.面向具体类:创建一个该类的实例对象,通过该实例对象调用其成员方法 优点:编写时简单 缺点:高耦合,后期h代码维护难,外部类严重依赖该类ÿ…...
如何购买网站/百度搜索资源管理平台
题目地址(559. N 叉树的最大深度) https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/ 题目描述 给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示,每组子节…...