在前面的文章里,我们了解了,如何登录使用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
删除前最好备份一次,不要轻易删除任何数据