MySQL数据类型(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL数据类型

三、文本、二进制类型

3.1 char类型

创建一个表,表中包含一个char(10)的content列

7aec95d4ac8444db9d89e7c06428c933.png



由于char(10)中最多可存储6个字符,因此只要插入的字符个数不超过6个都是能成功插入的。若插入的字符个数超过10个,那么就会报错

d01730e7d0e645669b5f67fce7c92dd5.png



在不同编码中,一个字符所占的字节个数是不同的,如utf8中一个字符占3个字节,而gbk中一个字符占2个字节。MySQL限定字符的概念不是限制字节的,用户不用关心复杂的编码细节


3.2 varchar类型

varchar类型测试


创建一个表,表中包含一个varchar(10)的content列


bc9595007c7f4f91bdb19ede0028352e.png


由于varchar(10)中最多可存储10个字符,因此只要插入的字符个数不超过6都是能够成功插入的。若插入的字符个数超过6个,那么就会报错


610e5601e3b14507a649af5837913d72.png


varchar类型可指定的字符个数上限


varchar类型最多占用65535字节,其中有1~2字节用来表示实际数据长度,还有1字节来存储其他控制信息,因此varchar类型的有效字节数最多是65532字节


而varchar类型可指定的字符个数上限,与表的编码格式有关:


对于utf8编码来说,一个字符占用三个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 3 = 21844

对于gbk编码来说,一个字符占用两个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 2 = 32766


在定义编码格式为utf8的表时,varchar(L)中的L若超过了21844,则会产生报错

5e4a4c9076784a6ab9a04905e13d4061.png



在定义编码格式为gbk的表时,varchar(L)中的L若超过了32766,则会产生报错


0022e167adda46539db3cfc069e1dc3f.png


3.3 char与varchar的区别

char和varchar比较


char类型可存储字符上限为255,varchar类型可存储字符上限则与表的编码格式有关

char(L)定义后,无论存储的字符串长度是否到达L,都会开辟用于存储L个字符的定长空间,若存储的字符串长度超过L则会报错

varchar(L)定义后,会根据存储字符串的长度按需开辟空间,并且需要使用1-3字节的空间用于表示存储字符串的长度以及其他控制信息,若存储的字符串长度超过L则会报错


如何选取char和varchar类型?


char类型的数据是定长的,因此磁盘空间比较浪费,但是效率高(直接访问定长的空间)

varchar类型的数据是变长的,因此磁盘空间比较节省,但是效率低(需要先读取存储字符串的长度,再访问指定长度的空间)

若要存储的数据是定长的,则使用char类型进行存储,如身份证号码、手机号、md5等。若要存储的数据是变长的,则使用varchar类型进行存储,如名字、地址等


四、时间日期类型

三种时间日期类型


date:日期格式为YYYY-MM-DD,占用三字节

datetime:时间日期格式为YYYY-MM-DD HH:MM:SS,占用八字节

timestamp:时间戳,格式为YYYY-MM-DD HH:MM:SS,占用四字节

创建一个表,表中包含date、datetime和timestamp三种时间日期类型的列


cbffb22b1d2f4616b4ee82b479b94aa0.png


通过表结构可以看出,timestamp类型的t3列不允许为空,其默认值为CURRENT_TIMESTAMP


446b99268b56450e9c9f1463b2986c1b.png


若插入数据时不插入t3列,则会自动插入当前时间戳


25c495d3ad5e4bdd8123e35ec2b378b2.png


timestamp类型使用案例


创建一个评论表,表中包含评论人的昵称、评论的内容和评论的发布时间


e80654242e274ff79157097fb240c8a7.png


向评论表中插入记录时,只需指明评论人的昵称和评论的内容,评论的发布时间默认会设置成该记录的插入时间


ce6af7be668243bdb2c275bb381c9291.png


若评论人修改了评论内容,就需对评论表更新,更新表的同时,评论的发布时间也会更新为修改表的时间


a62377974ca640f292c4edc82de27bf3.png


五、String类型

enum和set类型的区别如下:


在定义enum字段时需提供若干个选项的值,设置enum字段值时只允许选取其中的一个值

在定义set字段时需提供若干个选项的值,设置set字段值时可选取其中的一个或多个值

如人的性别只能从男和女中进行二选一,因此可以定义成enum类型,而人的爱好在提供的选项中可能存在多个,因此可以定义成set类型


调查表案例


创建一个调查表,表中包含被调查人的姓名、性别和爱好

1ff32963c81b4c099a9a22bd096e284b.png



向表中插入记录时,被调查人的性别能从男和女中进行二选一,被调查人的爱好可从提供的若干个选项中进行选择一项或多项,多个爱好之间需通过英文逗号隔开


89cccfd0b12942a8a45e0895345f9bdf.png


通过数字设置enum


在插入记录时,除了通过指明男女来设置性别,还可以通过插入数字1和2来设置性别



481b57e8e6e54ba4a58f793d2d278c71.png

MySQL出于效率考虑,在存储enum值时实际存储的都是数字,enum中提供的选项值依次对应数字1、2、3、…,最多65535个,因此在设置enum值时可以通过数字的方式进行设置


通过数字设置set


在插入记录时,除了通过指明多个选项来设置爱好,还可通过数字的方式来设置


20a555de188e4b8bb0637d4c4ab800e4.png


MySQL存储set值时实际存储的也是数字,set中提供的选项值依次对应数字1、2、4、8、…,最多64个,因此在设置set值时可以通过数字的方式进行设置。MySQL通过二进制理解数字设置,将数字11转换为二进制1011,即分别选择了第一个、第二个、第四个选项,即敲代码、游泳、乒乓球


注意:虽然enum和set可通过数字的方式进行设置,但不推荐,因为可读性太差,导致后期维护成本变高


enum和set查找


若想筛选出调查表中所有女同志的信息,那么直接在筛选时指明 gender='女' 即可,因为enum类型的值只能多选一


006bd6910ce2464f83c4441fd606f512.png


但若要筛选出调查表中爱好包含敲代码的人的信息就较为麻烦,若继续使用上述方式,那么最终筛选出来的是爱好仅为敲代码的人的信息

067f2bbc0e9a4529a658f7398c863959.png



这时需借助find_in_set(str,strlist)函数,该函数的作用是查询strlist中是否包含str,若包含则返回str在strlist中的位置(从1开始),否则返回0


通过select可以对find_in_set函数进行验证,依次查找集合a,b,c中是否包含字符a、b、d,这时在查找字符a、b和c时就会得到其在集合中的下标,而在查找字符d时就会得到0值


9c86095a2f484f63b3fdb0da09799b16.png


可以通过select搭配find_in_set函数,来筛选出爱好包含敲代码的人的信息了


63128e36dfe54df688559a6b89a8522f.png


还可以继续添加筛选条件,如筛选出爱好中包含敲代码,但爱好又不只是敲代码的人的信息



0d651d703332497aa734aa638ccedd3a.png


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2天前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
170 0
【MySQL】——数据类型及字符集
|
2天前
|
机器学习/深度学习 存储 关系型数据库
MySQL数据库:常用数据类型
【2月更文挑战第7天】
35 0
|
2天前
|
SQL 关系型数据库 MySQL
学习MySQL,创建表,数据类型
学习MySQL,创建表,数据类型
|
2天前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
114 1
|
2天前
|
存储 SQL 关系型数据库
MySql中有哪些数据类型(数据库学习——三)
MySql中有哪些数据类型(数据库学习——三)
40 1
|
2天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
2天前
|
SQL 存储 关系型数据库
【MySQL-6】DDL的表结构的数据类型盘点&案例演示
【MySQL-6】DDL的表结构的数据类型盘点&案例演示
|
2天前
|
存储 SQL 关系型数据库
【mysql】mysql中的数据类型知多少?
【mysql】mysql中的数据类型知多少?
|
2天前
|
关系型数据库 MySQL
MySQL基础(二:常用数据类型及MySQL创建过程实例)
MySQL基础(二:常用数据类型及MySQL创建过程实例)
MySQL基础(二:常用数据类型及MySQL创建过程实例)
|
2天前
|
存储 缓存 关系型数据库
【Mysql】Schema与数据类型优化
【Mysql】Schema与数据类型优化
16 0

推荐镜像

更多