MySQL介绍
是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一!是基于socket编写的一款C/S架构的软件。
1、常见的数据库
关系型数据库(需要有表结构)
- MySQL 是一款免费、开源、支持大中型企业的数据库,运用广泛,后来被Sun公司收购,最后由Oracle公司将Sun公司合并,mysql的创始人又开发了一款MariaDB,完全兼容mysql,使用起来跟mysql一模一样!!
- Oracle 是一款闭源且收费的分布式数据库,其功能极其强大!
- SQLsever 是微软旗下的,仅支持Windows系统,局限性强
- DB2 是IBM开发的数据库软件,闭源、收费,与IBM的机器绑定销售
非关系型(key-value形式储存,没有表结构)
- MongoDB
- Redis
- HBASE
- memcache
2、Linux系统下的MySQL安装方法
1.解压tar包 cd /software tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21 2.添加用户与组 groupadd mysql useradd -r -g mysql mysql chown -R mysql:mysql mysql-5.6.21 3.安装数据库 su mysql cd mysql-5.6.21/scripts ./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data 4.配置文件 cd /software/mysql-5.6.21/support-files cp my-default.cnf /etc/my.cnf cp mysql.server /etc/init.d/mysql vim /etc/init.d/mysql #若mysql的安装目录是/usr/local/mysql,则可省略此步 修改文件中的两个变更值 basedir=/software/mysql-5.6.21 datadir=/software/mysql-5.6.21/data 5.配置环境变量 vim /etc/profile export MYSQL_HOME="/software/mysql-5.6.21" export PATH="$PATH:$MYSQL_HOME/bin" source /etc/profile 6.添加自启动服务 chkconfig --add mysql chkconfig mysql on 7.启动mysql service mysql start 8.登录mysql及改密码与配置远程访问 mysqladmin -u root password 'your_password' #修改root用户密码 mysql -u root -p #登录mysql,需要输入密码 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; #允许root用户远程访问 mysql>FLUSH PRIVILEGES; #刷新权限
1. 解压 tar zxvf mariadb-5.5.31-linux-x86_64.tar.gz mv mariadb-5.5.31-linux-x86_64 /usr/local/mysql //必需这样,很多脚本或可执行程序都会直接访问这个目录 2. 权限 groupadd mysql //增加 mysql 属组 useradd -g mysql mysql //增加 mysql 用户 并归于mysql 属组 chown mysql:mysql -Rf /usr/local/mysql // 设置 mysql 目录的用户及用户组归属。 chmod +x -Rf /usr/local/mysql //赐予可执行权限 3. 拷贝配置文件 cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf //复制默认mysql配置 文件到/etc目录 4. 初始化 /usr/local/mysql/scripts/mysql_install_db --user=mysql //初始化数据库 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql //复制mysql服务程序 到系统目录 chkconfig mysql on //添加mysql 至系统服务并设置为开机启动 service mysql start //启动mysql 5. 环境变量配置 vim /etc/profile //编辑profile,将mysql的可执行路径加入系统PATH export PATH=/usr/local/mysql/bin:$PATH source /etc/profile //使PATH生效。 6. 账号密码 mysqladmin -u root password 'yourpassword' //设定root账号及密码 mysql -u root -p //使用root用户登录mysql use mysql //切换至mysql数据库。 select user,host,password from user; //查看系统权限 drop user ''@'localhost'; //删除不安全的账户 drop user root@'::1'; drop user root@127.0.0.1; select user,host,password from user; //再次查看系统权限,确保不安全的账户均被删除。 flush privileges; //刷新权限 7. 一些必要的初始配置 1)修改字符集为UTF8 vi /etc/my.cnf 在[client]下面添加 default-character-set = utf8 在[mysqld]下面添加 character_set_server = utf8 2)增加错误日志 vi /etc/my.cnf 在[mysqld]下面添加: log-error = /usr/local/mysql/log/error.log general-log-file = /usr/local/mysql/log/mysql.log 3) 设置为不区分大小写,linux下默认会区分大小写。 vi /etc/my.cnf 在[mysqld]下面添加: lower_case_table_name=1 修改完重启:#service mysql restart
3、windows绿色版安装及密码修改(版本为5.6.42)
# 1、下载MySQL: http://dev.mysql.com/downloads/mysql/ # 2、解压 # 将下载的压缩包解压到想要安装的目标盘下的文件夹 # 3、添加环境变量,将解压缩后的bin文件添加至系统环境变量,如:C:Program Files (x86)mysql-5.6.42-winx64in # 4、注册为系统服务,注:需要以管理员身份运行cmd mysqld --install # 5、启动mysqld服务 net start MySQL # 6、启动mysql客户端连接至mysql服务 mysql -uroot -p # 7、关闭mysql服务 net stop MySQL 或 taskill /f /pid PID号 或 tskill mysqld # 8、重启mysql客户端 mysql -uroot -p # 初始密码为空,直接回车进入 # 9、修改密码(须退出mysql操作) mysqladmin -uroot password "自己的密码" # 原密码为空时可以不用-p mysqladmin -uroot -p"旧密码" password "新密码"
4、忘记密码解决办法
Windows平台中的密码破解方式(mysql5.7版本),5.6版本为密码的字段为password
#1 关闭mysql服务 #2 在cmd中执行(跳过授权表登录操作):mysqld --skip-grant-tables #3 在新的cmd中执行:mysql #4 执行如下sql命令: update mysql.user set authentication_string=password('新密码') where user = 'root'; # 刷新权限 flush privileges; #5 tskill mysqld #或taskkill /f /pid pid号 #6 重新启动mysql
#1. 关闭mysql,可以用tskill mysqld将其杀死 #2. 在解压目录下,新建mysql配置文件my.ini #3. my.ini内容,指定 [mysqld] skip-grant-tables #4.启动mysqld #5.在cmd里直接输入mysql登录,然后操作 update mysql.user set authentication_string=password('新密码') where user='root and host='localhost'; # 刷新权限 flush privileges; #6.注释my.ini中的skip-grant-tables,然后启动myqsld,然后就可以以新密码登录了
Linux平台中的密码破解方式(mysql5.7版本)
1. 停止mysql /etc/init.d/mysqld stop 2. 启动数据库为无密码验证模式 mysqld_safe --skip-grant-tables --skip-networking & 3. 更新密码 update mysql.user set authentication_string=PASSWORD('456') where user='root' and host='localhost'; 4. 重启 /etc/init.d/mysqld restart 5. 登录 mysql -uroot -p456
5、统一字符编码
#1. 修改配置文件my.ini [mysqld] default-character-set=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 #mysql5.5以上: [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 #2. 重启mysql服务 #3. 查看修改结果: mysql>s mysql>show variables like '%char%'
6、为mysql服务指定配置文件(my.ini)
#在mysql的解压目录下,找到my.ini,然后配置 #1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效 [mysqld] port=3306 character-set-server=utf8 default-storage-engine=innodb innodb_file_per_table=1 -----------------针对5.7版本-------------------------- #解压的目录 basedir=D:mysql-5.7.23-winx64 #data目录 datadir=D:mysql-5.7.23-winx64data #在mysqld --initialize时,就会将初始数据存入此处指定的目录,在初始化之后,启动mysql时,就会去这个目录里找数据 ----------------------------------------------------- #2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效 [client] port=3306 default-character-set=utf8 # 可以将用户名密码配置在ini文件 user=root password=123 #3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置 [mysql] port=3306 default-character-set=utf8 #!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准
7、mysql再次启动时显示失败的解决方案
问题1:在使用net start msql启动时提示“服务没有报告任何错误”,启动失败!! 解决方案:先在配置文件my.ini中将data的路径和文件的根目录添加进去,如(datadir=D:mysql-5.7.23-winx64data;basedir=D:mysql-5.7.23-winx64),注意不是让你自己新建data文件夹!!而是当你在mysql的bin目录下执行mysqld --initialize-insecure的命令时自动添加的,第一次执行这个命令可能会等待的时间较长,并且控制台没有任何返回结果。只是需要稍等即可,完了你就可以看到mysql的根目录下会自己多出一个data文件夹 问题2:没有先执行mysqld --initialize-insecure,而是先执行net start mysql了,启动失败 解决方案:此时的解决方案是:删除data文件夹,然后执行mysqld - initializemysqld --initialize-insecure,再net start mysql 问题4:mysql安装完了,可高兴的输入“mysql或者mysql -uroot -p”一回车,居然没有进去,出现“ERROR 1045 Access denied for user 'xxx' NO”的错误 解决方案:mysql默认安装会有密码生成,密码文件直接写在 log-error日志文件中(在5.6版本中是放在 root/.mysql_secret 文件里,更加隐蔽,不熟悉的话可能会无所适从),MySQL5.7在安装完后,第一次启动时,会在root目录下生产一个随机的密码,文件名为.mysql_secret 进去之后重置密码:SET PASSWORD = PASSWORD('new password');
SQL语句
# 1. 操作文件夹 增: create database db1 charset utf8; 查: show databases; show create database db1; 改: alter database db1 charset utf8; 删: drop database db1; # 2. 操作文件 先切换到文件夹下:use db1 增: create table t1(id int,name char,...); 查: show tables; show create table db1; desc db1; 改: alter table t1 modify name char(1); alter table t1 change old_name new_name char(2); alter table t1 add name int; 改字符编码: alter table t1 default character set gbk 改文件名: rename table t1 to t2 删: drop table t1; # 3. 操作文件中的内容/记录 增: insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3'); 查: select * from t1; select id name from t1; 改: update t1 set name = 'sb' where id = 2; 删: delete from t1 where id = 1; 清空表: delete from t1; # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。 truncate table t1; 数据量大,删除速度比上一条快,重建表,清空所有数据 auto_increment 表示:自增 primary key 表示:约束(不能重复且不能为空);加速查找
表相关之存储引擎
1、什么是存储引擎
mysql中建立的库就是一个文件夹
库中建立的表就是一个文件
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
2、如何查看存储引擎
#查看所有支持的存储引擎
show enginesG
#查看正在使用的存储引擎
show variables like 'storage_engine%';
3、使用存储引擎
方法一:建表时指定
create table innodb_t1(id int,name char)engine=innodb;
create table innodb_t2(id int)engine=innodb;
show create table innodb_t1;
show create table innodb_t2;
方法二:从配置文件中指定
[mysqld]
default-storage-engine=INNODB
innodb_file_per_table=1
表相关之表的创建
1、介绍表
表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段,如:
id,name,age称为字段,其余每一行内容称之为一条记录
2、创建表
语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
注意:
在同一张表中,字段名是不能相同
宽度和约束条件可选
字段名和类型是必须的
数据类型之整型
1、所占的字节数
tinyint 1
smallint 2
mediumint 3
int 4
bigint 8
2、非严格模式下
默认情况下整型是有符号的,需要用一个二进制位存储符号
给整型加上约束unsigned来表示无符号
如果数据超出范围就保存最大的值,例如:在无符号下保存256 其实存的255
如果有符号 例如 tinyint 保存-129 其实存的是-128
查看当前模式命令 show variables like "sql_mode";
修改为严格模式命令 set global sql_mode = "STRICT_TRANS_TABLES";
3、严格模式下
如果值超出范围就直接报错,在一些版本中默认就是严格模式
在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库
4、长度限制对于整型的意义
create table t1(id int(1));
insert into t1 value(454555);
select *from t1;
发现这个数也存储成功
说明这里长度指的不是存储容量限制而是显示的宽度
如果你的数据超过了显示宽度,有几个长度就显示几个,其余的都不会显示出来
如果不足,则补全到指定长度:create table t2(id int(10) zerofill);
5、怎么选择整数型
可根据实际情况来判断,能够保存你的数据的最小类型即可
数据类型之字符型
1、分类
char 定长字符
varchar 变长字符
char 类型的长度是固定 无论你存储的数据有多长 占用的容量都一样
char(3) 存储的数据为"a " 在硬盘保存的数据还是占3字符长度 实际保存的是"a "
varchar 长度是可变的 存储的数据有多长就占用多长
varchar(3) 存储的数据为"a " 在硬盘保存的数据还是占1字符长度 实际保存的是"a"
yxx exx lxx zxx cx wxx char(3)
(1bytes+yx)(1bytes+exx)(1bytes+lx)(1bytes+zxx) varchar(3)
如果是可变长度 则有问题 不知道数据从哪里开始到哪里结束 所以需要有一个位置保存数据的长度
vharchar 能支持的最大长度是65535 用于保存数据长度的数据最长2bytes
如果是char类型,如果你的数据不足指定长度,就在后面用空格补全
2、验证
char_length 函数 可以查看字符的长度
create table t18(a char(4),b varchar(4));
insert into t18 value("x","x");
select char_length(a),char_length(b) from t18;
两个字段的长度都为1
3、结论
这是因为 mysql在存储时 自动加上的空格 对使用者而言是没有意义的 所以mysql自动帮你处理掉空格了
我们可以设置sql模式 来让它现出原形
set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES"
设置完成后重启msyql 再次查询长度
4、注意
当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除
select *from t19 where name = "yh"
当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 %
select *from t19 where name like "%yh%";
% 任意个数的任意字符
_ 1个任意字符
5、如何选择
char
存取效率高
浪费存储空间
varchar
存取效率低于char
节省存储空间
char和varchar 长度都比较小 最大就是65535
6、大文本类型
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT 文本是带有编码
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符数据 但是不带编码
二进制类型: 用于存储多媒体数据 比如视频 但是我们一般不会将多媒体数据存到数据 而是存储文件路径地址
BINARY系列 BINARY VARBINARY 存储二进制数据
数据类型之浮点型
1、所占字节数
float 4
double 8
decimal 不确定(手动指定)
2、给浮点设置宽度限制
float(m,d)
double(m,d)
decimal(m,d)
3、长度说明
m 表示这个浮点数整体的长度
d 表示小数部分的长度
例如: float(5,3) 最大值: 99.999
4、区别
相同点:
小数部分最大长度都是 30
float 和 double 的最大长度为 255
不同点:
decimal 的整体最大长度 65
精度不同
double 比 float 精度高
decimal 是准确的 不会丢失精度,对精确度要求高就使用 decimal
数据类型之日期型
1、分类
time 时分秒 HH:MM:SS
year 年份
date 日期 年 月 日
datetime 日期 + 时间 年 月 日 时 分 秒 年份最大是9999
timestamp 时间戳 从1970-1-1开始算 年份最大是2037
2、共同点
时间的存取通过字符串类型
都可以使用 now() 函数来插入当前时间
datetime 和 时间戳都能够表示日期和时间
3、不同点
年份最大范围不同
时间戳可以为空,即代表当前时间
时间戳在你更新记录时会自动更新为当前时间