数据库配置

通过配置文件统一配置的目的:统一管理 服务端(mysqld) 、客户端(client)

配置了 mysqld(服务端) 的编码为utf8,那么再创建的数据库,默认编码都采用utf8

配置流程

1)在mysql安装根目录下,创建配置文件:my.ini

mac下配置文件名叫 my.cnf

2)设置配置文件内容并保存

[mysqld]  # 服务器配置
port=3306 # 可以修改数据库默认端口(如果数据库端口被其他软件占用)
character-set-server=utf8 # 编码格式
collation-server=utf8_general_ci # 排序方式(默认跟编码格式走) [client] # mysql自己的客户端叫[mysql],配置[client]即配置了[mysql],也配置了其他存在方式的客户端,比如Navicat可视化客户端
default-character-set=utf8 # 编码格式

3)重启数据库服务

数据库修改信息

修改字符编码

mysql>: alter database 数据库名 charset=编码格式;

用户操作

为特定的数据库分配有该数据库 操作权限 的用户

mysql>: grant 权限们 on 数据库.表 to 用户名@'主机名' identified by '密码';

1)all:所有权限

2)oldboy.*:oldboy数据库下所有表

3)oldboy@'localhost':本机可以通过oldboy用户登入

4)identified by 'Oldboy123':密码为Oldboy123

eg>: grant all on oldboy.* to oldboy@'localhost' identified by 'Oldboy123';

1)select,delete,update,insert,drop,alter:指定的权限

2)oldboy.*:oldboy数据库下所有表

3)oldboy@'%':任何机器可以通过oldboy用户登入

4)identified by 'Oldboy123':密码为Oldboy123

eg>: grant select,delete,update,insert,drop,alter on oldboy.* to oldboy@'%' identified by 'Oldboy123';

#撤销权限

mysql>: revoke 权限1,权限2,... on 数据库名.表名 from 用户名@'主机名';
#禁掉本地oldboy用户对oldboy数据库的所有表的drop权限
eg:> revoke drop on oldboy.* from oldboy@'localhost';

删除用户

drop user 用户名@'主机名';

表的修改

修改表名

mysql>: alter table 旧表 rename 新表;

修改字段名

mysql>: alter table 表名 change 旧字段 新字段 类型(长度);

修改字段属性

mysql>: alter table 表名 modify 字段 新类型(长度);

创建表的完整语法

长度和约束在某些情况下是可以省略的

mysql>: create table 表名 (
属性名1 类型(长度) 约束,
...
属性名n 类型(长度) 约束
) engine=引擎 default charset=utf8;

数据库表的引擎:驱动数据的方式 - 数据库优化

前提: 引擎是建表是规定, 提供给表使用的, 不是数据库

展示所有引擎

mysql> show engines;

innodb(默认): 支持事务, 行级锁, 外键

mysql>: create table t11(id int)engine=innodb;

myisam: 查询效率要优于innodb, 当不需要支持事务, 行级锁, 外键, 可以通过设置myisam来优化数据库

mysql>: create table t12(id int)engine=myisam;

blackhole:黑洞,存进去的数据都会消失(可以理解不存数据)

mysql>: create table t13(id int)engine=blackhole;

memory:表结构是存储在硬盘上的,但是表数据全部存储在内存中

mysql>: create table t14(id int)engine=memory;

数据库的模式

mysql 5.7 以后默认都是安全模式

mysql 5.6 版本

sql_model=no_engine_substitution  # 非安全性,默认
sql_model=strict_trans_tables # 安全性

查看当前数据库模式:

show variables like "%sql_mode%"; # %匹配0~n个任意字符 => 模糊查询

临时设置为安全模式,服务重启后会被重置

mysql>: set global sql_mode="strict_trans_tables";  # 在root用户登录状态下

在设置后,quit断开数据库连接后(服务器不重启)就会进入安全模式

安全模式下,非安全模式下sql执行的警告语句,都会抛异常

eg>: create table t1(name char(2));
eg>: insert into t1 values ("ab") # 正常
eg>: insert into t1 values ("owen") # 错误 Data too long for column 'name' at row 1

mysql支持的数据类型

整型

类型

tinyint:1字节,取值范围-128~127,默认长度4

smallint:2字节,取值范围 -32768 ~ 32767,默认长度6

mediumint:3字节

int:4字节 -2147483648~2147483647

bigint:8字节

约束

unsigned:无符号

zerofill:0填充

建表

mysql>: create table tb1(x tinyint, y smallint, z int(6));

# 插入数据
mysql>: insert into tb1 values(128, 32768, 32768); # 结果:127,32767,32768

结论:整型的长度由所占字节(取值范围)决定,可以自定义长度,但是不影响所占字节(取值范围)

所有整型变量的长度一般都省略不写

结论>: create table tb1(x tinyint, y smallint, z int);

整型约束

mysql>: create table tb2(x tinyint unsigned);  # 0~255
mysql>: insert into tb2 values(256), (-1); # 255, 0

0填充约束

mysql>: create table tb3(x tinyint unsigned zerofill);
mysql>: insert into tb3 values(10); # 010

浮点型

在安全模式下测试浮点型类型

类型

float(M, D):4字节,3.4E–38~3.4E+38

double(M, D):8字节,1.7E–308~1.7E+308

decimal(M, D):所在字节M,D大值基础上+2,其实就是M值+2就是decimal字段所占字节数

'''

宽度

限制存储宽度

(M, D) => M为位数,D为小数位,M要大于等于D

float(255, 30):精度最低,最常用

double(255, 30):精度高,占位多

decimal(65, 30):字符串存,全精度

'''

建表:

mysql>: create table tb4 (age float(256, 30)); # Display width out of range for column 'age' (max = 255)
mysql>: create table tb5 (age float(255, 31)); # Too big scale 31 specified for column 'age'. Maximum is 30.
mysql>: create table tb5 (age float(65, 30)); # 在合理取值范围 mysql>: create table t12 (x float(255, 30));
mysql>: create table t13 (x double(255, 30));
mysql>: create table t14 (x decimal(65, 30));
# 1.111111164093017600000000000000
mysql>: insert into t12 values(1.11111111111111111119);
# 1.111111111111111200000000000000
mysql>: insert into t13 values(1.11111111111111111119);
# 1.111111111111111111190000000000
mysql>: insert into t14 values(1.11111111111111111119); # 重点:长度与小数位分析
# 报错,总长度M必须大于等于小数位D
mysql>: create table t14 (x decimal(2, 3)); # 能存储 -0.999 ~ 0.999,超长度的小数位会才有四舍五入,0.9994可以存,就是0.999,0.9995不可以存
mysql>: create table t14 (x decimal(3, 3)); # 整数位 3 - 3,所以最大为0 # 能存储 -9.999 ~ 9.999,超长度的小数位会才有四舍五入,9.9994可以存,就是9.999,9.9995不可以存
mysql>: create table t14 (x decimal(4, 3)); # 整数位 4 - 3,所以最大为9 # 能存储 -99.999 ~ 99.999,超长度的小数位会才有四舍五入,99.9994可以存,就是99.999,99.9995不可以存
mysql>: create table t14 (x decimal(5, 3)); # 整数位 5 - 3,所以最大为99

字符串:数据库优化 - char效率要高于varchar

类型

char:定长,永远采用设置的长度存储数据

varchar:不定长,在设置的长度范围内,变长的存储数据

宽度

限制存储宽度

char(4):存 "a" "ab" "abc" "abcd"都采用4个长度,"abcde" 只能存储前4位(安全模式下报错)

varchar(4):存 "a" "ab" "abc" "abcd"分别采用1,2,3,4个长度存储,"abcde" 只能存储前4位(安全模式下报错)

char就按定长存储,如果数据长度变化大,通常更占空间,但是存取数据按固定定长操作,效率高

varchar存储数据时,会先计算要存储数据的长度,动态变长存储数据,所以一般较省空间,但是计算是需要耗时的,所以效率低

varchar计算出的数据长度信息也是需要开辟空间来存储,存储在数据头(数据开始前)中,也需要额外消耗1~2个字节

所以如果数据都是固定长度,或是小范围波动,char相比就不会更占空间,且效率高

'''

建表

mysql>: create table ts1 (s1 char(4), s2 varchar(4));
mysql>: insert into ts1 values('adcde', 'xyzabc'); # 'adcd', 'xyza'

时间

类型

year:yyyy(1901/2155)
date:yyyy-MM-dd(1000-01-01/9999-12-31)
time:HH:mm:ss
datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)
timestamp:yyyy-MM-dd HH:mm:ss(1970-01-01 00:00:00/2038-01-19 ??)

建表

mysql>: create table td1 (my_year year, my_date date, my_time time);
mysql>: insert into td1 values(1666, '8888-8-8', '8:8:8'); # 时间需要在取值访问内 mysql>: create table td2 (my_datetime datetime, my_timestamp timestamp);
mysql>: insert into td2 values('2040-1-1 1:1:1', '2040-1-1 1:1:1'); # 时间需要在取值访问内
mysql>: insert into td2(my_datetime) values('2040-1-1 1:1:1'); # timestamp不复制会才有系统当前时间 # datetime:8字节,可以为null
# timestamp:4字节,有默认值CURRENT_TIMESTAMP

枚举与集合

枚举与集合:为某一个字段提供选项的 - 枚举只能单选(1个),集合可以多选(0-n个)

建表

enum、set默认值为NULL

mysql>: create table tc1 (name varchar(20), sex enum('男', '女', '哇塞'), hobbies set('男', '女', '哇塞'));
mysql>: insert into tc1 values('ruakei', '哇塞哇塞', '未知');

enum、set手动设置默认值 '男' 与 '哇塞'

mysql>: create table tc2 (name varchar(20), sex enum('男', '女', '哇塞') default '男', hobbies set('男', '女', '哇塞') default '哇塞');
mysql>: insert into tc2 values('ruakei', '哇塞哇塞', '未知');
mysql>: insert into tc2(name) values('ruakei');

对sex、hobbies两个字段赋值错误,系统默认用空字符串填充(非安全模式),安全模式抛异常

如果对出sex、hobbies两个字段外的其他字段进行赋值,这两个字段会才有默认值

注:对set类型的字段进行赋值,用一个字符串,字符串内部用,将多个选项隔开,且不能添加空格等其他额外字符

mysql>: insert into tc2 values('ruakei_1', '女', '男,女,哇塞');

约束

primary key:主键,唯一标识,表都会拥有,不设置为默认找第一个 不空,唯一 字段,未标识则创建隐藏字段

foreign key:外键

unique:唯一性数据, 该条字段的值需要保证唯一,不能重复

auto_increment:自增,只能加给key的int类型字段,作为辅助修饰,一个表中只能设置一个自增字段

not null:不为空 - 针对一些字段,如注册时的用户名,出生人的性别等,这些需求下的字段,只不能设置为Null,必须要对其赋值

default:默认值 - 对有默认值意外的字段进行赋值时,有默认值的字段会被赋默认值

unsigned:无符号 - 存储的数字从0开始

zerofill:0填充 - 存整数时数据长度小于取值范围长度,会在数字左方用0填充

not null 与 default 限制

不能为空,没有默认值的x,必须赋值

y、z在没有赋值情况下,才有默认值,设置值后,采用默认值

mysql>: create table td1 (x int not null, y int default 0, z int default 100);

# 报错,auto_increment必须设置给 键字段
mysql>: create table td2 (x int auto_increment);
# 报错,auto_increment必须设置给 int字段
mysql>: create table td2 (x char(4) auto_increment);
# 报错,auto_increment字段最多出现 1次
mysql>: create table td2 (x int unique auto_increment, y int unique auto_increment); # 正确,主键和唯一键分析
# x为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
mysql>: create table td21 (x int unique auto_increment, y int unique);
# y为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
mysql>: create table td22 (x int unique, y int unique auto_increment);
# x为主键:设置了主键就是设置的,主键没设置自增,那自增是可以设置在唯一键上的
mysql>: create table td23 (x int primary key, y int unique auto_increment);
# x为主键:设置了主键就是设置的,主键设置了自增,自增字段只能有一个,所以唯一键不能再设置自增了
mysql>: create table td24 (x int primary key auto_increment, y int unique);
# 默认主键:没有设置主键,也没有 唯一自增键,那系统会默认添加一个 隐式主键(不可见)
mysql>: create table td25 (x int unique, y int unique); # 唯一键:确保一个字段,数据不能重复
# 主键:是一条记录的唯一标识(可以理解为数据的编号) # 联合唯一
# ip在port不同时,可以相同,ip不同时port也可以相同,均合法
# ip和port都相同时,就是重复数据,不合法
mysql>: create table tu1 (ip char(16), port int, unique(ip, port)); # 也可以设置成 联合主键,道理同 联合唯一
mysql>: create table tu2 (ip char(16), port int, primary key(ip, port));
# sql可以多行书写
mysql>:
create table t22(
ip char(16),
port int,
primary key(ip,port)
); # 通常自增字段的 自增索引 会被永久记录,想清空表并清空自增索引:
mysql>: truncate 数据库名.表名

浅谈MySQL数据库基本操作的更多相关文章

  1. (转)运维角度浅谈MySQL数据库优化

    转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...

  2. 运维角度浅谈MySQL数据库优化(转)

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...

  3. 从运维角度浅谈 MySQL 数据库优化

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...

  4. 运维角度浅谈MySQL数据库优化

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...

  5. 浅谈MySQL 数据库性能优化

    MySQL数据库是 IO 密集型的程序,和其他数据库一样,主要功能就是数据的持久化以及数据的管理工作.本文侧重通过优化MySQL 数据库缓存参数如查询缓存,表缓存,日志缓存,索引缓存,innodb缓存 ...

  6. 浅谈MySQL数据库面试必要掌握知识点

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 MySQL官方地址 https://www.mysql.com/ MySQL 8系列最新版本为8.0.27,5系列的最 ...

  7. 浅谈MySQL数据库

    目录 什么是数据库 定义 发展现状 数据库基本概念 数据库分类 关系数据库 非关系型数据库(NoSQL) 数据库启动与连接 启动服务端 连接数据库 用户信息查看 数据库的基本操作 表的基本操作 记录的 ...

  8. mysql分享一:运维角度浅谈MySQL数据库优化

    转于:http://lizhenliang.blog.51cto.com/7876557/1657465 1.数据库表设计要合理避免慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等 2. ...

  9. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

随机推荐

  1. Java实现 LeetCode 802 找到最终的安全状态 (DFS)

    802. 找到最终的安全状态 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后能走到终点,那么 ...

  2. Java实现 LeetCode 368 最大整除子集

    368. 最大整除子集 给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0. 如果有多个目标子集, ...

  3. 第八届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.平方十位数 题目描述 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比 ...

  4. Java实现最大流量问题

    1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点n能够接收的最大流量.图中每条边的权值 ...

  5. pi-star镜像 下载地址

    Pi-Star_NanoPi_Air_V3.4.17_09-Jan-2019.zip nanopi air点这里  Pi-Star_NanoPi_V3.4.17_09-Jan-2019.zip nan ...

  6. ASP.NET Core 3.1 WebApi部署到腾讯云CentOS 7+Docker

    一.准备 首先需要有一台CentOS服务器,安装最新版Docker,配置镜像加速等,安装方法网上很多,下面是一些相关指令: yum install -y yum-utils device-mapper ...

  7. 如何优雅地停止 Spring Boot 应用?

    首先来介绍下什么是优雅地停止,简而言之,就是对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响,可以继续完成已有请求的处理,但是停止接受新请求. 在 Spring Boot 2.3 中增加了 ...

  8. Python3和Python2中int和long的区别?

    Python3:Python3中int类型的范围是动态长度的,正整数或者负整数,用sys.getsizeof()可以看int占了几位. Python2:Python2中long类型的范围是无限大小.

  9. 02.vue-router的进阶使用

    关键字:路由懒加载,全局导航守卫,组件导航守卫,redirect重定向,keep-alive,params,query 一.目录结构            二.index.js // 配置路由相关的信 ...

  10. 关于adb的下载和基本使用

    我们无论是开发还是测试,对Android SDK一定都不陌生,如果我们要使用adb(Android debug bridge)命令,那么这个就必不可少了. 1.给大家提供一个下载地址:https:// ...