Mysql数据库操作篇1(数据类型,库&表修改操作)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Mysql数据库操作篇1(数据类型,库&表修改操作)

在前面的文章里,我们了解了,如何登录使用mysql,如何在mysql中创建数据库,及在数据库中创建表,那么你要想在数据库中存入数据,那么你总得有相关的数据类型呀,如果想要修改数据库的名称和表的名称又该如何操作呢?这就是此篇博客要解决的问题

小约定:[ ]里的内容为可选项


MySQL的数据类型

在编程语言中,给我们提供了int,char,double等数据类型来存储数据,那么数据库作为一个专门存储数据的软件,在数据类型这方面自然是要下狠功夫,那么我们来学习一下,MySQL给使用者提供了哪些数据类型吧

数值类型

类型名:tinyint [unsigned]

存储数据范围:有符号: -128 ~ 127(整数) 无符号:0 ~ 256(整数)

超出这个数据范围,会直接拦截报错

类型名:smallint  [unsigned]

存储数据范围:有符号: -2^15 ~ 2^15 -1(整数) 无符号:2^16 - 1(整数)

超出这个数据范围,会直接拦截报错

类型名:int  [unsigned]

存储数据范围:有符号: -2^31 ~ 2^31 -1(整数) 无符号:2^32 - 1(整数)

超出这个数据范围,会直接拦截报错

类型名:bigint  [unsigned]

存储数据范围:有符号: -2^63 ~ 2^63 -1(整数) 无符号:2^64 - 1(整数)

超出这个数据范围,会直接拦截报错

类型名:bit(M)

存储数据范围:位类型,M表示比特位的个数,默认为1,最大为64位

位图的数据在显示时,默认按照ASCII的格式显示的,如果插入的数字比较小,那么可能不会显示出来数据,因为有些ASCII值是不可显的,想要看到值可以转换成十进制

dec(column_name)括号里是数据类型为bit的属性列的名称,以十进制的形式显示出来

超出最大能插入的数据范围,会直接拦截报错

类型名:bool

存储数据范围:布尔类型,取值为0或1,0表示假,1表示真

我们在使用编程语言,例如C语言,超出数据类型能表示的范围时,那么程序并不会报错,一般会采取截断处理,但是在MySQL这里会直接拦截报错,mysql保证数据的合法性,这是一种约束,不合法的数据,不允许存储

说到约束,可能很多同学觉得这是个贬义词,在程序的世界里,约束是一个能避免很多错误的有效手段,每个程序员的水平都不同,每个程序员都会犯错误,通过一些约束条件,能够倒逼程序员规范自己

像MySQL这种特别注重数据有效,安全的软件,自然会有很多的约束条件来避免大量的错误,不允许非法的数据插入就是其约束条件之一,后面还有很多约束条件,我们之后逐步介绍这些约束条件

小数类型

float(m, d)[unsigned]:M指定显示长度,d指定小数位数,占用4个字节空间

整数部分的位数为:m-d,绝对不能超过这个位数,否则就会拦截报错

小数部分的位数d, 如果超过了d位数,那么会采用四舍五入的方法,但是如果进位了使得整数部分的位数超过了m-d则也会报错拦截

float的精度损失是比较严重的,默认情况下的float小数位的精度仅为2位,最大精度位数约为7位,如果数据对小数位要求比较高,那么不建议使用float,选择使用decimal

decimal(m, d)[unsigned]:M指定显示长度,d指定小数位数

decimal保证了数据的精度,如果对精度要求比较高,那么可以采用decimal

最大m为65, 支持的最大d为30 如果m被省略,默认是10,如果d被省略,默认为0

字符串类型

在说字符串类型之前,先回忆一下编码的知识

因为计算机中只能存储0和1,美国人要想把ABC等这类字符在计算机中表示出来,那就得设计一套规则用0和1表示出来ABC这些字符。

这个规则就是ASCII编码,ASCII编码占用一个字节,共8个比特位,其中第一个比特位为0,用来作为识别位,那么就只剩下7个比特位来表示字符,共计128个,这些对于美国人来说完全够用了,但是计算机不止有美国人在用,美国人用英文字母,那么中国人得用汉字啊,所以ASCII这一套规则就不能用于表示汉字。

那么我们中国人就搞出了自己的编码规则,GBK(也称为国标码),我们的国标码要占用两个字节,为了和ASCII区分开,我们的第一位开头为1,那么计算机在识别时看到第一个比特位为1,那么就会读取两个字节,如果开头是0,说明是ASCII编码,那么读取一个字节就可以了,因为国标码占用两个字节,去掉一个标识位,那么能够表示出的汉字范围就是2^15个

世界是逐渐趋于全球化的,如果每一个国家都搞出一个自己国家的编码标准,那么就会导致程序无法在世界范围内通用,为了解决这个问题,世界组织提倡一种可供全球所有国家共同使用的编码形式

utf-32,这种方法比较暴力,表示任意字符都是占用四个字节,假如表示字符a,原本一个字节就能搞定的,用这种编码形式就得多占用3个字节,而且这三个字节全部为空,因此,这种编码方法过于奢侈

utf-8,这是一种可变长的编码形式,共有四个长度区,1个字节,2个字节,3个字节,4个字节,其中一个字节区就是兼容ASCII编码的,中国的汉字字符占用3个字节

同样的问题,计算机该如何识别当前字符采用的是哪个长度区呢?所以每个长度区的开头都必须规定一些标识码,用来让计算机识别当前字符是属于哪个长度区的,标识码如下

0xxxxxxx

110xxxxx 10xxxxxx

1110xxxx 10xxxxxx 10xxxxxx

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

了解完这些,我们再去学习数据库中的字符类型就是轻而易举了

char(L) 固定长度字符串,L是可以存储的长度,单位为字符,L的最大值为255(注意这里是字符不是字节,字节的大小是不确定的,因为MySQL默认采用的是utf8编码,这是可变长的编码形式,上面有说过,存储的字符不同占用的字节就不同)

varchar(L) 可变长字符串,L表示字符长度,最大长度为65535个字节,注意varchar最大只能存放65535个字节,你想要知道varchar能够存放多少个字符,就要算一算了

当我们的表的编码是utf8时,varchar(L)的参数L最大值是65532/3=21844,因为utf8中,一个字符最多占用3个字节,如果编码是GBK,varchar(L)的参数L最大是65532/2=32766(因为gbk中,一个字符占用2字节)

为什么用65532除,而不是用65535除,因为varchar的字节长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532

注意:可变长的意思是L是上限,如果L用不完,用多少给多少

我知道你们心里可能还有这样的疑问,不是说utf-8编码有四个长度区吗?怎么你说utf8一个字符最多占用3个字节,不应该是四个字节吗

这是因为MySQL中的utf8字符集实际上是一种“变种”的UTF-8编码,它只支持最多3个字节的UTF-8编码,因此每个字符最多只能占用3个字节。这种“变种”的UTF-8编码被称为“MySQL UTF-8”或“utf8mb3”

如果要存储包含四字节UTF-8编码字符的文本,需要将该列的字符集设置为UTF8MB4,并将该列的最大长度定义为16383个字符

如果只需要存储英文字母和一些常见字符,可以将该列的字符集设置为LATIN1,这样就可以定义更大长度的VARCHAR类型的列

日期类型

date:日期'yyyy-mm-dd',占用三字节
datetime:时间日期格式,'yyyy-mm-dd HH:ii:ss'占用八个字节
timestamp:时间戳,以'yyyy-mm-dd HH:ii:ss'形式显示,会自动更新,不需要赋值

string类型

enum('选项一','选项二', ...)

这些选项只能多选一,每一个选项分别对应数字1,2,3...最多为65535,在添加枚举值时,可用枚举名称,也可用数字来表示

同样在用select语句查询时,既可以用选项名称,也可以用数字来表示

set('选项一','选项二',...)

这些选项可以多选多,每一个选项是用位图来表示,最多只能有64个选项

用select查询时,对指定选项查询比较严格,只能查只有这个选项的元组,如果想查包含这个选项的元组,那么就需要使用find_in_set函数来完成

find_in_set(a, 'a,b,c')检查参数一这单个元素,是否在参数二这个参数集合里


库与表的修改操作

库相关的修改操作

绿色部分表示要自己填写,黄色是固定部分

#创建数据库 --本质在/var/lib/mysql 下创建一个目录

create database name

#删除数据库

drop database name charset=utf8(指定编码集) collate utf8_general_ci(指定校验集)

#查看数据库

show databases

#查看当前在哪个数据库里

select database()

#修改数据库字符集

alter database name charset='xxx字符集' collate 'xxx校验集'

创建数据库时,有两个编码集

1.数据库字符集 -- 数据库未来存储数据(以什么样的编码形式存储数据)

2.数据库校验集 -- 支持数据库进行字段比较时使用的编码,本质也是一种读取数据库中数据时采用的编码格式(取出数据库中的数据进行排序,比较时以什么样的编码规则操作)

在MySQL中,校验码用于确定在排序、比较和搜索字符串时使用的规则。校验码包含一个字符集和一种排序规则。排序规则包括比较大小写、忽略空格、比较特殊字符等。常见的校验码包括utf8_general_ci、utf8_bin、latin1_swedish_ci等。其中,utf8_general_ci是一种常用的校验码,它使用UTF-8字符集,并忽略大小写进行比较。

数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的

#查看默认编码集

show variables like 'character_set_database'

#查看默认校验集

show variables like 'collation_database'

库的备份与恢复

#备份 可以备份多个数据库

mysqldump -p 3306 -u root -p -B db_name > xxxfile.sql

-B后面跟的是要备份的数据库的名称 > 后面跟的是备份文件的名称

#恢复

source xxx要恢复的文件的路径

#备份数据库中的表

mysqldump -p 3306 -u root -p db_name table_name1 table_name2 ... > xxxfile.sql

上述命令中,如果在备份的过程中,没有带上-B选项,那么在source恢复的时候需要先创建一个空的数据库

表相关的修改操作

#创建表

CREATE TABLE [if not exist] table_name (

field1 datatype,

field2 datatype,

field3 datatype

) [character set 字符集 collate 校验规则 engine 存储引擎]

#查看表的详细信息

desc table_name

show create table table_name \G

#修改表    最好不要轻易修改表的结构,不要轻易修改

1. 修改表名

alter table table_name rename to new_name

2. 新增属性列

alter table table_name add column_name value_type [comment(描述性信息)] after column_name(放在某个列之后)

3. 修改属性列的数据类型属性

alter table table_name modify column_name value_type

4. 删除属性列

alter table table_name drop column_name

一旦删除所有的数据都没了,不要轻易删除某个属性列,删之前最好备份一次

5. 修改属性列的名字

alter table table_name change name new_column_name value_type

#删除表

drop table table_name

删除前最好备份一次,不要轻易删除任何数据


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL 监控 关系型数据库
MySQL 延迟从库介绍
本文介绍了MySQL中的延迟从库功能,详细解释了其工作原理及配置方法。延迟从库允许从库在主库执行完数据变更后延迟一段时间再同步,主要用于快速恢复误操作的数据。此外,它还可用于备份、离线查询及数据合规性需求。通过合理配置,可显著提升数据库系统的稳定性和可靠性。
139 4
|
2月前
|
SQL 关系型数据库 MySQL
MySQL操作利器——mysql-connector-python库详解
MySQL操作利器——mysql-connector-python库详解
586 0
|
12天前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
37 5
|
14天前
|
SQL DataWorks 关系型数据库
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
|
17天前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
25 1
|
30天前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
27 2
|
1月前
|
关系型数据库 MySQL 数据库
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
34 5
|
1月前
|
存储 关系型数据库 MySQL
MySQL支持多种数据类型
MySQL支持多种数据类型
98 3
|
1月前
|
存储 关系型数据库 MySQL
什么是mysql的数据类型?
什么是mysql的数据类型?
47 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据类型
MySQL数据类型
50 2