目录
2.1.2 create database if not exists 数据库名;
2.1.3 create database 数据库名 character set 字符集名字;
1.MySQL的前提知识
1.1 数据库的操作形式
数据库的操作可以分为“命令行客户端”和“图形化客户端”,推荐大家使用命令行进行操作,因为命令行是程序员之间通用的,图形化则不然。
sql语句可以在多行进行操作,最后以分号进行结尾。
1.2 数据库登陆问题
如果输入密码后闪退,无法看到错误信息,可能是“密码有误”或者“服务未开启”。查询错误原因:
打开cmd,将“MySQL启动程序.exe文件”或“快捷方式”拖进cmd中,输入密码,查看并分析错误信息。
密码错误:
服务未开启:
登陆成功:
1.3 数据库对数据的组织方式
2.对数据库的操作
2.1 创建数据库
2.1.1 create database 数据库名;
如果数据库已经存在的话,就创建不了
2.1.2 create database if not exists 数据库名;
这个创建方式是为了在创建数据库的时候因为同名数据库已经被创建而报错,,在实际开发中是很有用的,很多时候,会把一系列的sql语句放在一个文件中,批量执行,如果遇到一条sql语句报错,后面的sql语句就执行不了了。
2.1.3 create database 数据库名 character set 字符集名字;
可以在创建数据库的时候指定字符集。因为在数据库中要存储一些中文,而MySQL中默认的字符集是拉丁文的,并不支持中文。所以在创建数据库的时候必须要指定支持中文的字符集,如UTF8/GBK,数据库中的UTF8是一个“残本”,因为少了emoji表情,而UTF8mb4则是“完整体”,这个UTF8mb4是数据库独有的,其他地方难以见到。
(不同字符集中的汉字所占用的字节数不一样,GBK是两个字节,UTF8是三个字节。GBK现在用得越来越少了,主要用的是UTF8,因为UTF8是边长编码,最短一个字节,最长4个字节,能表示世界上任意一种语言文字。Unicode是给一个字符进行编码的,无法给字符串进行编码,如果将多个Unicode编码的字符放在一起构成一个字符串,就无法区分字符与字符之间的边界。而UTF8是基于Unicode演化出的可以给字符串编码的版本。在Java中,字符类型是用Unicode编码的,字符串是用UTF8编码的,两者并不冲突,多个字符组成一个字符串的时候,Java会自动将编码转换为UTF8)
2.2 查看数据库
show databases;
其中以下四个数据库是MySQL自带的:
2.3 选中数据库
use 数据库名;
这是数据库中最关键的操作,因为之后的对数据表的操作就在选中数据库的基础上进行的。
2.4 删除数据库
2.4.1 drop database 数据库名;
删库操作是非常危险的,删库会把库里的表和表里的数据也会一同删除掉,是无法恢复的,在实际开发的时候,切记要谨慎删库。“从删库,到跑路”搞不好可能还会进去哦。
2.4.2 关于数据库的错误报警程序
数据库分为“线上数据库/开发环境数据库”和“线下数据库”。线上数据库是被用户访问的,是保存用户信息的,非常重要,一般会搭配错误报警程序。而线下数据库则是存放开发人员自己构造的数据,用于测试功能的。MySQL服务器是24小时全年无休一直工作的,如果服务器挂了,会产生很大的影响,报警程序会监测服务器的运行状态,一旦发现问题,就会触发报警,通过邮件/短信/wx/电话通知程序员。在发布新版本程序的时候,需要重启服务器,但是这样会触发报警,会把错误通知给领导,所以一般发布新版本的时候都会先把报警程序关闭,等发布完程序之后,千万要记得再次开启报警程序,否则造成的后果很严重。
为了避免上述的危险操作,引进了几个解决方法:
1.控制权限:
新人进行简单的库操作,对于危险的库操作给经验更丰富的程序员进行操作,甚至有的公司会有专门的岗位(dba)进行更复杂更有风险的数据库操作。
2.及时将数据库备份:
把数据备份几份,即使有一份数据出问题了,可以通过其他备份的数据进行恢复过来,天级别的备份(每天备份一次),实时备份,提高安全性。
3.让经验丰富的程序员一起操作
进行危险操作时,拉组长或者师傅监督你,多一个人,多一双眼,让他跟你一起操作,万一出现问题了,还能分锅。
3.数据类型
3.1 数值类型
数据类型 | 大小 | 说明 | 对应Java类型 | 对应C语言类型 |
---|---|---|---|---|
BIT[(M)] | M指定位数,默认为1 | 二进制数,M范围从1到64,存储数织范围从0到2^M-1 | 常用Boolean对应BIT,此时默认时1位,即只能存0和1 | char[] |
TINYINT | 1字节 | Byte | signed char | |
SMALLINT | 2字节 | Short | short int | |
INT | 4字节 | Integer | int | |
BIGINT | 8字节 | Long | long long int | |
FLOAT(M,D) | 4字节 | 单精度,M指定长度,D指定小数位数,会发生精度丢失 | Float | float |
DOUBLE(M,D) | 8字节 | 单精度,M指定长度,D指定小数位数,会发生精度丢失 | Double | double |
DECIMAL(M,D) | M/D最大值+2 | 双精度,M指定长度,D指定小数位数,精确数值 | Big Decimal | char[] |
NUMERIC(M,D) | M/D最大值+2 | 双精度,M指定长度,D指定小数位数,精确数值 | Big Decimal | char[] |
BIT[(M)]:比特数,M表示比特的位数,默认为1,通常用于表示0和1。很少用到。
TINYINT/SMALLINT/INT/BIGINT:表示整数数值,主要用到的是INT。
FLOAT/DOUBLE:M代表数值长度,D代表小数点后的位数。例如DOUBLE(3,1):31.5、23.6。这两个数据类型使用的是IEEE 754标准,所以会有精度丢失的问题(0.1+0.2 != 0.3)。
DECIMAL/NUMERIC:精度更高,但是运算速度变慢,占用空间也更大。
(小技巧:在计算钱的时候,不能使用float和double这种精度会丢失的数据类型,但decimal和numeric运算慢,不适合在流水较多的场景使用,更好的选择是使用int来表示,现在一般都是将钱精确到分(小数点后两位),所以可以用int表示用分作为单位的金额。)
3.2 字符串类型
数据类型 | 大小 | 说明 | 对应Java类型 | 对应C语言类型 |
---|---|---|---|---|
VARCHAR(SIZE) | 0-65535字节 | 可变长度字符串 | String | char[] |
TEXT | 0-65535字节 | 长文本数据 | String | char[] |
MEDIUMTEXT | 0-16777215字节 | 中等长度文本数据 | String | char[] |
BLOB | 0-65535字节 | 二进制形式的长文本数据 | byte[] | char[] |
VARCHAR(SIZE):(重点掌握)size表示最多存储几个字符,而不是几个字节,size为10,并不是立刻分配10个字符大小的空间,而是先分配一个小的空间,如果不够,再自动扩展,最多10个字符大小。
TEXT/MEDIUMTEXT:表示文本数据,存放字符。通常只用到TEXT,MEDIUMTEXT太长一般用不到。
BLOB:码表上查不到的就是二进制数据,比如视频/音频/图片等都属于二进制数据。一般很少在数据库的某列中存放特别大的数据,一般都是将这种图片/视频文件放在一个专门的目录中,数据库中存放该图片的路径。
3.3 日期类型
数据类型 | 大小 | 说明 | 对应Java类型 | 对应C语言类型 |
---|---|---|---|---|
DATETIME | 8字节 | 范围从1000到9999年,不会进行时区的检索及转换 | java.util.Date/java.sql.Timestamp | MYSQL_TIME |
TIMESTAMP | 4字节 | 范围从1970到2038年,自动检索当前时区并进行转换 | java.util.Date/java.sql.Timestamp | MYSQL_TIME |
DATETIME/TIMESTAMP:TIMESTAMP只能用到2038年,到了那时将会用尽,会出现严重bug(如2000年的“千年虫”),尽量使用DATETIME。这个类型的值填写格式是:'年-月-日 时:分:秒',(如果想获取到当前时间,可以使用now()这个函数代替值)
3.4 数据库数据类型的独特之处
为什么数据库的类型这么独特呢,其实SQL是一个古老的语言,是跟C语言同一个时期出现的,当时的语言还没有统一的命名规范,各种天马行空的语言都有,直到后来才统一了规范,就是如今主流的类似Java数据类型,所以SQL语言的数据类型成了活化石般的存在。)
上述数据类型中主要用到的是:1.int 2.long 3.double 4.decimal 5.varchar 6.datetime
4.对数据表的操作
4.1 创建表
create table 表名(列名 类型,列名 类型,……);
(如果想让表名/列名和关键字一样,可以用反引号 ` 将表名/列名括起来。)
4.2 查看表
show tables;
4.3 查看指定表的结构
desc 表名;
Field:字段/列/属性
Type:数据类型。int括号中的11表示显示的宽度,跟内部存储的容量无关。
Null:yes表示该列允许为null,no表示不能为null。跟选填和必填类似。
Key:
Default:表示该列的默认值。
Extra:
4.4 删除表
drop table 表名;
此操作性质跟删库一样,非常危险,谨慎操作,甚至严重性比删库还严重,删库能够第一时间报错,删表有可能不会第一时间报错,会“带伤工作”一段时间,用错误的数据运行,可能造成的后果非常严重。
4.5 修改表结构
可以使用alter table进行修改,因为在实际开发应用中基本用不到,此处就不多介绍了。