日常操作
修改密码
# 修改旧密码
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
flush privileges;
quit;
# 空密码情况下设置密码
法1.用root 进入mysql后
set password =password('你的密码');
flush privileges;
法2.用root 进入mysql后,使用GRANT语句
grant all on *.* to 'root'@'localhost' IDENTIFIED BY '你的密码'with grant option ;
flush privileges;
MySQL8:
mysql8安装后默认空密码
mysqladmin -u root -p password [新密码]
提示输入旧密码(旧密码为空直接回车);修改完成
密码强度问题
set global validate_password_policy=0;
set global validate_password_mixed_case_count=0;
set global validate_password_number_count=3;
set global validate_password_special_char_count=0;
set global validate_password_length=3;
SHOW VARIABLES LIKE 'validate_password%';
参考:https://www.linuxidc.com/Linux/2018-01/150126.htm
设置数据库的独立密码
mysql -u root -p
> (输入密码)
> create user 'user1'@'localhost' identified by '1234';
> grant all privileges on *.* to 'root'@'localhost';
> grant all privileges on 库名.* to 'user1'@'192.168.10.%' identified by '1234';
> flush privileges;
> exit;
该命令也可以用来修改数据库权限等等灵活应用,库名.表名
改为对应的,如库名.*
;localhost
可以为一个网段192.168.10.%
;
删除用户的权限:drop user root@'%';
常用命令
https://blog.csdn.net/mingyu1016/article/details/54017918
https://zhidao.baidu.com/question/1800624779598184747.html
安装、配置
太老的版本请自行查找资料,这里以mysql 5.7为最低版本,5.7版本开始,初始密码出现了一些变化,yum安装的默认是生成随机密码,源码编译安装在未使用参数指定的情况下是默认为空密码。
yum安装
参考:http://blog.csdn.net/jameshadoop/article/details/72821970
# Centos 7 + MySQL 5.7
rpm -ivh http://repo.mysql.com/mysql57-community-release-el7-9.noarch.rpm
yum install mysql-server
systemctl start mysqld
systemctl enable mysqld
# 查看随机密码
cat /var/log/mysqld.log | grep password | grep 'root@localhost' | awk -F 'root@localhost: ' '{print $2}'
注意!这个密码只能登录一次就会失效!以下有两种方式修改密码
法一:用mysqladmin,不登录直接修改
格式:mysqladmin -u用户名 -p随机密码 password 新密码
例:mysqladmin -uroot -pvo2lFOrqNl+. password XSvb5vmfNP6
回车后就修改完成了,如果mysql是空密码直接回车两次即可。
法二:登录后修改密码(该方法也适用于忘记密码的情况)
mysql -u root -p随机密码
use mysql;
update user set authentication_string=PASSWORD("新密码") where user='root';
update user set plugin="mysql_native_password";
flush privileges;
quit;
systemctl restart mysqld
注意:如果报ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
可以使用以下语句修改密码
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
flush privileges;
如果报:error: 'Your password does not satisfy the current policy requirements'
可以参考文章开头的“密码强度问题”。
MariaDB 安装方法也是一样的。
官方说明:https://mariadb.com/kb/en/mariadb/yum
cat > /etc/yum.repos.d/MariaDB.repo <<EOF
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
yum update #会提示确认安装MariaDB10.2的源及源指纹
yum install MariaDB-server MariaDB-client #安装的是MariaDB10.2.7
# 启动服务并修改密码(默认空密码)
systemctl start mariadb
改密码和mysql的一样。
源码安装
下载源码包:https://dev.mysql.com/downloads/mysql
安装编译工具:
yum install ncurses-devel bison openssl-devel bison-devel libaio libaio-devel gcc gcc-c++ cmake -y
安装脚本
这里以mysql-5.5.47.tar.gz为例,指定安装目录是/usr/local/mysql,指定data目录是/usr/local/mysql/data。
groupadd mysql
useradd -r -g mysql mysql
cd /root
wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.47.tar.gz
tar xvf mysql-5.5.47.tar.gz
cd mysql-5.5.47/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DMYSQL_USER=mysql
make -j2 #-j2是指定用2个CPU核进行make
make install
配置
chmod +w /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql
ln -s /usr/local/mysql/lib/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16
chown -R mysql:mysql /usr/local/mysql/
cd /usr/local/mysql/support-files/
cp my-large.cnf /etc/my.cnf #一般只要运行这台命令
cp mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
vim /etc/rc.d/init.d/mysqld
#确保有以下两行
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
开机启动
# Centos 6
chkconfig --add mysqld
chkconfig --level 345 mysqld on
# Centos 7
systemctl enable mysqld
忘记密码
# 第一步还是要想办法登录mysql
法一:安全参数启动
修改配置文件[mysqld]栏中加入一句skip-grant-tables并重启mysql
此时输入mysql -uroot登录,
法二:尝试mysql.sock登录
mysql -uroot -S /usr/local/mysql/mysql.sock -p
如果用mysql.sock登录报错:ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/usr/local/mysql/mysql.sock‘ (2)。
先看看有没有mysql.sock文件,有的话可能是权限问题,更改一下权限为当前用户(root用户一般不会出现这种情况):`chown -R leo:leo /usr/local/mysql(mysql安装目录)`然后重启一下数据库;再次尝试
# 修改密码
use mysql;
update user set authentication_string=PASSWORD("新密码") where user='root';
update user set plugin="mysql_native_password";
flush privileges;
quit;
如果是法一方式,记得编辑配置,删除安全参数
systemctl restart mysqld
有可能因为sock的问题,修改好后密码不会立刻生效,要断开ssh重连才会生效。
参考:http://www.jb51.net/article/99965.htm
http://www.cnblogs.com/qq78292959/archive/2012/11/21/2780917.html
http://blog.csdn.net/daydreamingboy/article/details/8125700
关于my.cnf文件位置
默认情况下,MySQL会依次按顺序查找如下几个路径来获取MySQL配置问文件:
/etc/my.cnf
/etc/mysql/my.cnf
/etc/my.cnf/my.cnf
/usr/local/mysql/my.cnf
~/.my.cnf
增
创建数据库
mysql> CREATE DATABASE 库名;
mysql> USE 库名;
mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));
# 创建数据库时指定编码
CREATE DATABASE my_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 查看数据库编码
use my_db_name;
show variables like 'character_set_database';
# 查看表排序方式
show create table my_table_name;
# 修改现有数据库编码
alter database my_db_name CHARACTER SET gb2312;
创建只读用户
use mysql;
GRANT Select ON *.* TO 'zabbix_read'@'192.168.10.%' IDENTIFIED BY "123456";
flush privileges;
创建表
use demo;
create table pet(
name varchar(20), #名字
owner varchar(20), #主人
species varchar(20), #种类
sex char(1), #性别
birth date, #出生日期
death date #死亡日期
)
为了验证你的表是按你期望的方式创建,使用一个DESCRIBE语句:
创建表(复杂形式):
创建customer表:
create table customers(
id int not null auto_increment,
name char(20) not null,
address char(50) null,
city char(50) null,
age int not null,
love char(50) not null default 'No habbit',
primary key(id)
)engine=InnoDB;
SELECT last_insert_id();这个函数可以获得返回最后一个auto_increment值。默认值为:default 'No habbit',
引擎类型,多为engine = InnoDB,如果省略了**engine=**语句,则使用默认的引擎(MyISAM)
在表中增加字段
基本的语法为:
alter table <表名> add <字段名> <字段类型int,text...>;
# 例
alter tables rediscache add dataKey varchar(500);
# rediscache是表名,添加字段名dataKey,类型为:varchar,长度:500
另一种稍微复杂一点:(在ims_users表的remark字段之后增加ucuserid字段,设置为int类型,该字段不为空)
alter table ims_users add column ucuserid int not null default 0 after remark;
删
删除数据库
mysql> DROP DATABASE 库名;
删除表
mysql> DROP TABLE 表名;
将表中记录清空
mysql> DELETE FROM 表名;
删除字段
基本的语法为:
alter table <表名> drop <字段名>;
# 例
alter tables rediscache drop dataKey;
# rediscache是表名,字段名dataKey
删除用户、用户权限
use mysql;
删除用户:Delete FROM user Where User='user1' and Host='localhost';
删除用户权限:drop user root@'%';
flush privileges;
清空表
Mysql清空表是很重要的操作,也是最常见的操作之一,下面就为您详细介绍Mysql清空表的实现方法,希望能够对您有所帮助。
方法1:重建库和表
用mysqldump --no-data把建表SQL导出来,然后drop database再create database,执行一下导出的SQL文件,把表建上;
mysqldump -u root -p --no-data dbname > schema.sql
方法2:生成清空所有表的SQL
mysql -N -s information_schema -e "SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,"
如果只想清空某个表,执行以下语句(-f是强制执行):
mysql -N -s information_schema -e "SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM TABLES WHERE TABLE_SCHEMA='eab12'" | mysql -f eab12
即清空eab12中所有的表。如果有外键的话,很可能会报错。多执行几次,直到不报错。
删除数据库中的数据
DELETE FROM
语句用于从数据库表中删除记录。
语法
DELETE FROM table_name
WHERE column_name = some_value
注释:SQL 对大小写不敏感。DELETE FROM 与 delete from 等效。
为了让 PHP 执行上面的语句,我们必须使用 mysql_query( 函数。该函数用于向 SQL 连接发送查询和命令。
例子
稍早时,我们在本教程中创建了一个名为 "Persons" 的表。它看起来类似这样:
FirstName | LastName | Age |
---|---|---|
Peter | Griffin | 35 |
Glenn | Quagmire | 33 |
下面的例子删除 "Persons" 表中所有 LastName='Griffin' 的记录:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
mysql_query("DELETE FROM Persons WHERE LastName='Griffin'");
mysql_close($con);
?>
在这次删除之后,表是这样的:
FirstName | LastName | Age |
---|---|---|
Glenn | Quagmire | 33 |
删除字段
执行删除命令,使用drop关键字。
基本的语法为:alter table <表名> drop column <字段名>;
先看test_table表中有那些字段:select * from test_table;
删除birth1字段:alter table test_table drop column birth1;
再次检查:select * from test_table;
改
开启数据库远程登录
# Mysql8以下版本
use mysql;
Grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
# Mysql8以上版本
use mysql;
update user set host='%' where user ='root';
flush privileges;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
参考:https://blog.csdn.net/h996666/article/details/80921913
%表示是所有的外部机器,如果指定某一台机,就将%改为相应的机器名(或者是ip地址);‘root’则是指要使用的用户名。
此命令也可以用来修改登录端,或者修改用户密码。
修改表类型(修改存储引擎)
创建时指定存储引擎
CREATE TABLE `rediscache` (
`id` int(11) NOT NULL auto_increment,
`sender` varchar(255) default NULL,
`receiver` varchar(255) default NULL,
`content` longtext,
`is_read` char(1) default 'N',
`send_time` datetime default NULL,
`del_flag` tinyint(4) default '0',
PRIMARY KEY (`id`)
) ENGINE=MYISAM;
创建后修改存储引擎
ALTER TABLE `rediscache` ENGINE = INNODB; #rediscache是表名,修改存储引擎为INNODB
修改字段长度(字段容量)
例如在typecho中,typecho_contents表中text字段下存放文章数据,字段长度是text(~64kb),当文章字数太多了,64kb不够存储,就会报错:Database Query Error;只要修改字段长度为:longtext就行了。
describe `rediscache`; #rediscache是表名,就能看到Type的类型
SHOW CREATE TABLE `rediscache`; #能看到存储引擎
格式:alter table 表名 modify column 字段名 类型;
alter table rediscache modify column data varchar(500);
alter table rediscache modify column data longtext;
批量修改表前缀
# 用phpmyadmin执行SQL语句就可以得到修改语句。再在命令行中执行。
Select CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO ', replace(table_name,'旧前缀_','新前缀_'),';')
from information_schema.tables
where TABLE_SCHEMA = '数据库名' and table_name LIKE '旧前缀_%';
# 得到如下格式的修改语句;粘贴回phpmyadmin中检查语法;无误后在命令行中执行。
ALTER TABLE tc_wx_img RENAME TO gw_wx_img;
mysql max_allowed_packet 设置过小导致记录写入失败
mysql根据配置文件会限制server接受的数据包大小。有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。
查看目前配置:show VARIABLES like '%max_allowed_packet%';
看到的是以B为单位,除以1024转换为KB,再除以1024装换为MB。
修改配置:my.cnf(windows下是my.ini );把max_allowed_packet = 20M 改为你需要的值。
找不到配置文件可以用:mysql --help | grep my.cnf
法二:在mysql命令行中修改
在mysql 命令行中运行:set global max_allowed_packet = 20*1024*1024
(这里改为20M)
然后退出命令行,重启mysql服务,再进入。
show VARIABLES like '%max_allowed_packet%';
查看下max_allowed_packet是否编辑成功
max_connection 关于最大连接数
MySQL> show status like '%connect%';
connections:试图连接到MySQL服务器的连接数(不管成功与否)。
max_used_connections:每个数据库用户的最大连接数。
threads_connected:当前的连接数。
mysql> show variables like '%connect%';
max_connections:数据库服务器最大连接数。
mysql> show processlist;
显示当前正在执行的MySQL连接。
修改连接数直接修改配置文件,加上对应的语句就行,如:
在配置文件(my.cnf或my.ini)在最下面,填加一句:max_connections=32000
然后,用命令重启:/etc/init.d/mysqld restart
虽然这里写的32000,实际MySQL服务器允许的最大连接数16384;添加了最大允许连接数,对系统消耗增加不大。
# 临时修改,不用重启数据库立刻生效。
set global max_connections = 1000;
关于设置及优化,参考:https://yq.aliyun.com/articles/50273
连接数设置太小报错:Too many connections
修改链接数就可以了。最好先用set修改,看看能否解决问题,然后再改配置文件。
关于连接错误次数过多时,MySQL禁止客户机连接
使用mysqladmin flush-hosts命令清除缓存,命令执行方法如下:
1.命令行或终端:mysqladmin -u user_name -p flush-hosts
接着输入账号密码即可
2.修改mysql配置文件,在**[mysqld]**下面添加 max_connect_errors=1000
,然后重启mysql
修改列名、修改字段名
alter table table_name change <旧字段名> <新字段名> <int(表类型)>;
字段顺序调整
参考:http://database.51cto.com/art/201011/234259.htm
修改操作
UPDATE
语句用于修改数据库表中的数据。
语法
mysql
UPDATE table_name
SET column_name = new_value
WHERE column_name = some_value
注释:SQL 对大小写不敏感。UPDATE 与 update 等效。
为了让 PHP 执行上面的语句,我们必须使用 mysql_query( 函数。该函数用于向 SQL 连接发送查询和命令。
例子
稍早时,我们在本教程中创建了一个名为 "Persons" 的表。它看起来类似这样:
FirstName | LastName | Age |
---|---|---|
Peter | Griffin | 35 |
Glenn | Quagmire | 33 |
下面的例子更新 "Persons" 表的一些数据:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
mysql_query("UPDATE Persons SET Age = '36'
WHERE FirstName = 'Peter' AND LastName = 'Griffin'");
mysql_close($con);
?>
在这次更新后,"Persons" 表格是这样的:
FirstName | LastName | Age |
---|---|---|
Peter | Griffin | 36 |
Glenn | Quagmire | 33 |
插入
INSERT INTO table_name
VALUES (value1, value2,....)
您还可以规定希望在其中插入数据的列:
INSERT INTO table_name (column1, column2,...)
VALUES (value1, value2,....)
注释:SQL 语句对大小写不敏感。INSERT INTO 与 insert into 相同。
为了让 PHP 执行该语句,我们必须使用 mysql_query() 函数。该函数用于向 MySQL 连接发送查询或命令。
例子
在前面的章节,我们创建了一个名为 "Persons" 的表,有三个列:"Firstname", "Lastname" 以及 "Age"。我们将在本例中使用同样的表。下面的例子向 "Persons" 表添加了两个新记录:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
mysql_query("INSERT INTO Persons (FirstName, LastName, Age)
VALUES ('Peter', 'Griffin', '35')");
mysql_query("INSERT INTO Persons (FirstName, LastName, Age)
VALUES ('Glenn', 'Quagmire', '33')");
mysql_close($con);
?>
更改表结构
- 增加一列:
alter table pet add des char(100) null;
- 删除:
alter table pet drop column des;
- 重命名表:
rename table pet to animals;
- 添加id字段:
alter table pet add id int not null
primary key auto_increment first;
详见:http://www.cnblogs.com/beginman/p/3249472.html
关于数据库排序规则
数据库中的排序规则一般很少去改,不过如JIRA之类的软件可能不支持某些排序规则,就会不断的弹出警告,修改排序规则参考:
https://www.22vd.com/7013.html
http://blog.csdn.net/li_xiao_ming/article/details/52152414
https://confluence.atlassian.com/jirakb/health-check-database-collation-790955315.html
把来自表单的数据插入数据库
现在,我们创建一个 HTML 表单,这个表单可把新记录插入 "Persons" 表。
这是这个 HTML 表单:
<html>
<body>
<form action="insert.php" method="post">
Firstname: <input type="text" name="firstname" />
Lastname: <input type="text" name="lastname" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
当用户点击上例中 HTML 表单中的提交按钮时,表单数据被发送到 "insert.php"。"insert.php" 文件连接数据库,并通过 $_POST 变量从表单取回值。然后,mysql_query() 函数执行 INSERT INTO 语句,一条新的记录会添加到数据库表中。
下面是 "insert.php" 页面的代码:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES
('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "1 record added";
mysql_close($con)
?>
查
常用查询
status #查看数据库运行状态
show processlist; #查看正在执行的Sql语句
show full processlist; #查看正在执行的Sql语句
show variables like '%max_connections%'; #查看最大连接数量
show status like '%Max_used_connections%'; #服务器响应的最大连接数
show global status like 'Max_used_connections'; #服务器响应的最大连接数
show status like '%Threads_connected%'; #查询当前连接数
show status like '%table_lock%'; #查询表锁定
show status like 'innodb_row_lock%'; #查询行锁定
show status like '%qcache%'; #查询缓存情况
show variables like "%query_cache%"; #查询缓存配置信息
show variables like "%binlog%"; #查询核心日志
show status like 'Aborted_clients'; #由于客户端没有正确关闭连接已经死掉,已经放弃的连接数量
show variables like '%timeout%'; #查看超时时间
show variables like 'log_%'; #查看日志是否启动
show warnings; #查询警告信息
select database(); #查看当前选择的数据库
show variables like '%datadir%'; #查看数据库保存位置
慢查询:
# 查看mysql系统参数
show variables like "%slow%";
show variables like '%quer%';
show variables like 'slow_query%';
show variables like 'long_query_time'; #查看要记录的时间阀值
show variables like '%log_output%'; #查看日志输出格式,
注意以下几个值
- slow_query_log off关闭状态 on开启状态
- slow_query_log_file 慢查询日志存放地点
**注意:**默认名为主机名.log,慢查询日志是否写入指定文件中,需要指定慢查询的输出日志格式为文件,相关命令为:show variables like '%log_output%';
去查看输出的格式)。 - long_query_time 指定了慢查询的阈值,即如果执行语句的时间超过该阈值则为慢查询语句。
- log_queries_not_using_indexes 如果值设置为ON,则会记录所有没有利用索引的查询
注意:如果只是将log_queries_not_using_indexes设置为ON,而将slow_query_log设置为OFF,此时该设置也不会生效,即该设置生效的前提是slow_query_log的值设置为ON,一般在性能调优的时候会暂时开启。
开启慢日志
# 法一(临时:不用重启mysql):
# root登陆数据库
# 注意:5.5以下版本可能无法开启,这时先设置set global log_slow_queries=ON;
set global slow_query_log=ON;
set global log_queries_not_using_indexes = ON; #记录所有没有利用索引的查询;slow_query_log开启了此项开启才会有效,否则是不生效的
set global long_query_time = 3; #设置查询超过3秒的没有使用索引的将会被记录到慢查询日志中
set global slow_query_log_file='/var/run/mysqld/mysqld-slow.log'; #设置慢查询日志存放位置,也可以保持默认
# 可选参数
set global log_output='TABLE'; #设置日志输出到表
set global log_output='FILE'; #设置日志输出到文件
set global log_output='FILE,TABLE'; #设置日志输出到文件和表
# 法二(永久:需要重启mysql):
vim /etc/my.cnf
# 在[mysqld]下的下方加入
slow_query_log = ON #5.5以下版本改为:log_slow_queries = ON
long_query_time = 3
slow_query_log_file = /var/run/mysqld/mysqld-slow.log
测试
# 登陆数据库,查看是否生效了
show variables like 'slow_query%';
show variables like 'long_query_time';
# 执行一条慢查询语句
select sleep(4);
cat /var/run/mysqld/mysqld-slow.log
参考:
https://www.cnblogs.com/luyucheng/p/6265594.html
http://blog.csdn.net/timchen525/article/details/75268151
关于processlist:https://www.cnblogs.com/jasondan/p/3491258.html
关于Max connections:https://www.cnblogs.com/qmfsun/p/4844285.html
查询数据库的大小,占用空间
use information_schema;
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables; #查询所有数据的总大小
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='databases_name'; #查询指定数据库的大小
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='库名' and table_name='表名'; #查询指定数据库中的某个表的大小
查看库,表类型(存储引擎),表结构
sataus #查看数据库运行状态
show databases;
use weixin888;
show tables; #只能显示表名,不能得到表类型的信息
SHOW TABLE STATUS FROM weixin888; #weixin888是库名,显示的(所有表的信息)第二项type即是表的类型
describe rediscache; #rediscache是表名,就能看到Type的类型
desc table_name; #查看表结构
SHOW CREATE TABLE rediscache; #显示的是表创建时的信息,其中有TYPE或ENGINE一项,指定了表的类型
use mysql;select host,user from user; #查看用户的权限情况
use mysql;select host,user,password from user; #查看用户账户、密码、可登录host
查看表中的列、类型
SHOW COLUMNS FROM auth_user;
或
DESCRIBE auth_user;
describe 表名 是 show columns from 表名 的一种快捷方式。
查询
SELECT
语句用于从数据库中选取数据。
语法
SELECT column_name(s) FROM table_name
注释:SQL 语句对大小写不敏感。SELECT 与 select 等效。
为了让 PHP 执行上面的语句,我们必须使用** mysql_query()** 函数。该函数用于向 MySQL 发送查询或命令。
例子
下面的例子选取存储在 "Persons" 表中的所有数据(* 字符选取表中所有数据):
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
$result = mysql_query("SELECT * FROM Persons");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'] . " " . $row['LastName'];
echo "<br />";
}
mysql_close($con);
?>
上面这个例子在 $result
变量中存放由 mysql_query()
函数返回的数据。接下来,我们使用 mysql_fetch_array()
函数以数组的形式从记录集返回第一行。每个随后对 mysql_fetch_array()
函数的调用都会返回记录集中的下一行。 while loop
语句会循环记录集中的所有记录。为了输出每行的值,我们使用了 PHP 的 $row
变量( $row['FirstName']
和 $row['LastName']
)。
以上代码的输出:
Peter Griffin
Glenn Quagmire
备份(导出)、恢复数据库
备份一个数据库
通用方法:
mysqldump -u user_name -p db_name > file_name.sql
或
mysqldump db_name > file_name.sql -u root -p
windows:进到MySQL的安装目录(bin下),运行:
mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-lock-tables database_name>database.sql
IP改为localhost也行。
注意:!!!
如果数据库中存储了emoji之类的特殊字符,备份的时候要加--default-character-set=utf8mb4
参数,utf8mb4是数据库编码,一般存储了特殊字符的数据库都使用utf8mb4而不是utf8。
mysqldump --default-character-set=utf8mb4 -u user_name -p db_name > file_name.sql
导出数据库中的一个表
mysqldump -u user_name -p db_name table_name> file_name.sql
导入恢复
# 先登录数据库创建该库。
source /root/mydb123.sql
mysql -u用户名 -p 数据库名 < 数据库名.sql
mysql -uuser_name -p mydb123 < /root/mydb123.sql
MySQL特性
MySQL 数据类型
下面的可使用的各种 MySQL 数据类型:
数值类型 | 描述 |
---|---|
int(size) | 仅支持整数。在 size 参数中规定数字的最大值。 |
smallint(size) | 仅支持整数。在 size 参数中规定数字的最大值。 |
tinyint(size) | 仅支持整数。在 size 参数中规定数字的最大值。 |
mediumint(size) | 仅支持整数。在 size 参数中规定数字的最大值。 |
bigint(size) | 仅支持整数。在 size 参数中规定数字的最大值。 |
--- | --- |
decimal(size,d) | 支持带有小数的数字。在 size 参数中规定数字的最大值。在 d 参数中规定小数点右侧的数字的最大值。 |
double(size,d) | 支持带有小数的数字。在 size 参数中规定数字的最大值。在 d 参数中规定小数点右侧的数字的最大值。 |
float(size,d) | 支持带有小数的数字。在 size 参数中规定数字的最大值。在 d 参数中规定小数点右侧的数字的最大值。 |
文本数据类型 | 容量 | 描述 |
---|---|---|
char(size) | ~ | 支持固定长度的字符串。(可包含字母、数字以及特殊符号)。在 size 参数中规定固定长度。 |
varchar(size) | ~ | 支持可变长度的字符串。(可包含字母、数字以及特殊符号)。在 size 参数中规定最大长度。 |
tinytext | ~1kb | 支持可变长度的字符串,最大长度是 255 个字符。 |
text | ~64kb | 支持可变长度的字符串,最大长度是 65535 个字符。 |
mediumtext | ~16MB | 支持可变长度的字符串,最大长度是 16777215 个字符。 |
longtext | ~4GB | 支持可变长度的字符串,最大长度是 4294967295 个字符。 |
日期数据类型 | 描述 |
---|---|
date(yyyy-mm-dd) | 支持日期或时间 |
datetime(yyyy-mm-dd hh:mm:ss) | 支持日期或时间 |
timestamp(yyyymmddhhmmss) | 支持日期或时间 |
time(hh:mm:ss) | 支持日期或时间 |
杂项数据类型 | 描述 |
---|---|
enum(value1,value2,ect) | ENUM 是 ENUMERATED 列表的缩写。可以在括号中存放最多 65535 个值。 |
set | SET 与 ENUM 相似。但是,SET 可拥有最多 64 个列表项目,并可存放不止一个 choice |
主键和自动递增字段
每个表都应有一个主键字段。
主键用于对表中的行进行唯一标识。每个主键值在表中必须是唯一的。此外,主键字段不能为空,这是由于数据库引擎需要一个值来对记录进行定位。
主键字段永远要被编入索引。这条规则没有例外。你必须对主键字段进行索引,这样数据库引擎才能快速定位给予该键值的行。
下面的例子把 personID 字段设置为主键字段。主键字段通常是 ID 号,且通常使用 AUTO_INCREMENT 设置。AUTO_INCREMENT 会在新记录被添加时逐一增加该字段的值。要确保主键字段不为空,我们必须向该字段添加 NOT NULL 设置。
例:
$sql = "CREATE TABLE Persons
(
personID int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(personID),
FirstName varchar(15),
LastName varchar(15),
Age int
)";
mysql_query($sql,$con);
其他情况
在 HTML 表格中显示结果
下面的例子选取的数据与上面的例子相同,但是将把数据显示在一个 HTML 表格中:
<?php
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
$result = mysql_query("SELECT * FROM Persons");
echo "<table border='1'>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>";
while($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['FirstName'] . "</td>";
echo "<td>" . $row['LastName'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_close($con);
?>
以上代码的输出:
FirstName | LastName |
---|---|
Peter | Griffin |
Glenn | Quagmire |
连接数据库失败
看提示,PHP执行时看错误,是用mysql还是mysqli
语法
mysql_connect(servername,username,password);
参数描述servername可选。规定要连接的服务器。默认是 "localhost:3306"。username可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。password可选。规定登录所用的密码。默认是 ""。
语法
CREATE DATABASE database_name
参数 | 描述 |
---|---|
servername | 可选。规定要连接的服务器。默认是 "localhost:3306"。 |
username | 可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。 |
passwd | 可选。规定登录所用的密码。默认是 ""。 |
为了让 PHP 执行上面的语句,我们必须使用 mysql_query() 函数。此函数用于向 MySQL 连接发送查询或命令。
连接:
例子:
php
<?php
//在一个变量中 ($con) 存放了在脚本中供稍后使用的连接。如果连接失败,将执行 "die" 部分:
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
创建:
mysql
// Create database
//创建了一个名为 "my_db" 的数据库:
if (mysql_query("CREATE DATABASE my_db",$con))
{
echo "Database created";
}
else
{
echo "Error creating database: " . mysql_error();
}
// Create table in my_db database
//创建一个名为 "Persons" 的表,此表有三列。列名是 "FirstName", "LastName" 以及 "Age":
//重要事项:在创建表之前,必须首先选择数据库。通过 mysql_select_db() 函数选取数据库。
//注释:当您创建 varchar 类型的数据库字段时,必须规定该字段的最大长度,例如:varchar(15)。
mysql_select_db("my_db", $con);
$sql = "CREATE TABLE Persons
(
FirstName varchar(15),
LastName varchar(15),
Age int
)";
mysql_query($sql,$con);
mysql_close($con); //提前关闭连接,请使用 mysql_close() 函数,不加此句则脚本结束后关闭。
?>
评论区