【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)

结束语

感谢你的阅读

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Makefile学习

一、Makefile的介绍 1.1 什么是Makefile 相信在Linux系统中经常会用到make这个命令来编译程序,而执行make命令所依赖的文件便是Makefile文件,make命令通过Makefile文件编写的内容对程序进行编译。make命令根据文件更新的时间戳来决定哪些文件需要重新编…

纯css html 真实水滴效果

惯例,不多说直接上图 秉承着开源精神,我们将这段代码无私地分享给大家,因为我们深信,信息的共享和互相学习是推动科技进步的关键。我们鼓励大家在使用这段代码的同时,也能够将其中的原理、思想和经验分享给更多的人。 这份代码是我们团队用心…

一百八十六、大数据离线数仓完整流程——步骤五、在Hive的DWS层建动态分区表并动态加载数据

一、目的 经过6个月的奋斗,项目的离线数仓部分终于可以上线了,因此整理一下离线数仓的整个流程,既是大家提供一个案例经验,也是对自己近半年的工作进行一个总结。 二、数仓实施步骤 (五)步骤五、在Hive的…

Purism 推出注重隐私的 Linux 平板电脑

导读一款昂贵的 Linux 平板电脑,注重安全和隐私。让我们拭目以待。 Purism 是一家日益流行的计算机硬件产品制造商,专门提供配备注重隐私的开源 Linux 发行版的笔记本电脑、台式机和移动设备。 最近,他们发布了一款新产品 Librem 11 平板电…

ARM底层汇编基础指令

汇编语言的组成 伪操作 不参与程序执行,但是用于告诉编译器程序怎么编译.text .global .end .if .else .endif .data 汇编指令 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能 伪指令 不…

嵌入式Linux应用开发-基础知识-第十六章GPIO和Pinctrl子系统的使用

嵌入式Linux应用开发-基础知识-第十六章GPIO和Pinctrl子系统的使用 第十六章 GPIO 和 Pinctrl 子系统的使用16.1 Pinctrl 子系统重要概念16.1.1 引入16.1.2 重要概念16.1.3 示例16.1.4 代码中怎么引用pinctrl 16.2 GPIO子系统重要概念16.2.1 引入16.2.2 在设备树中指定引脚16.2…

软件设计模式系列之二十一——观察者模式

1 观察者模式的定义 观察者模式(Observer Pattern)是一种行为型设计模式,它允许对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这个模式也被称为发布-订阅模式…

数据结构 | 二叉树

基本形状 可参照 数据结构:树(Tree)【详解】_数据结构 树_UniqueUnit的博客-CSDN博客 二叉树的性质 三种顺序遍历

BUUCTF reverse wp 51 - 55

findKey shift f12 找到一个flag{}字符串, 定位到关键函数, F5无效, 大概率是有花指令, 读一下汇编 这里连续push两个byte_428C54很奇怪, nop掉下面那个, 再往上找到函数入口, p设置函数入口, 再F5 LRESULT __stdcall sub_401640(HWND hWndParent, UINT Msg, WPARAM wPara…

Kafka(一)使用Docker Compose安装单机Kafka以及Kafka UI

文章目录 Kafka中涉及到的术语Kafka镜像选择Kafka UI镜像选择Docker Compose文件Kafka配置项说明KRaft vs Zookeeper和KRaft有关的配置关于Controller和Broker的概念解释Listener的各种配置 Kafka UI配置项说明 测试Kafka集群Docker Compose示例配置 Kafka中涉及到的术语 对于…

Spring5应用之AOP切入点详解

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言切入点详解切…

简单三步 用GPT-4和Gamma自动生成PPT PDF

1. 用GPT-4 生产PPT内容 我想把下面的文章做成PPT,请你给出详细的大纲和内容 用于谋生的知识,学生主要工作是学习,成年人的工作是养家糊口,这是基本的要求,在这之上,才能有更高的追求。 不要短期期望过高…

C#(CSharp)入门教程

目录 C#的第一个程序 变量 折叠代码 变量类型和声明变量 获取变量类型所占内存空间(sizeof) 常量 转义字符 隐式转换 显示转换 异常捕获 运算符 算术运算符 布尔逻辑运算符 关系运算符 位运算符 其他运算符 字符串拼接 …

计算机图像处理-高斯滤波

高斯滤波 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到…

Ubuntu部署运行ORB-SLAM2

ORB-SLAM2是特征点法的视觉SLAM集大成者,不夸张地说是必学代码。博主已经多次部署运行与ORB-SLAM2相关的代码,所以对环境和依赖很熟悉,对整个系统也是学习了几个月,一行行代码理解。本次在工控机上部署记录下完整的流程。 ORB-SLA…

koa基础应用

不要把koa想得太复杂,他就是一个Node框架而已。 在本地应用安装好Node和koa后,先实现一下简单的服务app.js,代码如下: const Koa require(koa) const app new Koa(); app.use(async (context) > {context.body hello Koa …

企业风险管理策略终极指南

企业风险管理不一定是可怕的。企业风险管理是一个模糊且难以定义的主题领域。它涵盖了企业的多种风险和程序,与传统的风险管理有很大不同。 那么,企业风险管理到底是什么?在本文中,我们将确定它是什么,提出两种常见的…

B058-SpringBoot

目录 springboot概念与作用入门案例springboot运行方式热部署配置文件Profile多环境支持整合测试-springboot-testSpringboot-web1.返回json数据2.返回页面(模板技术)thymeleaf1.导入thymeleaf依赖2.模板文件3.controller4.启动类 SSM整合1.导包2.项目目…

机器人中的数值优化|【四】L-BFGS理论推导与延伸

机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化,拟牛…

让大脑自由

前言 作者写这本书的目的是什么? 教会我们如何让大脑更好地为自己工作。 1 大脑的运行机制是怎样的? 大脑的基本运行机制是神经元之间通过突触传递信息,神经元的兴奋和抑制状态决定了神经网络的运行和信息处理,神经网络可以通过…