一、在ubuntu下安装MySQL
使用ubuntu18.04(阿里云或华为云服务器)
apt安装mysql-server
sudo apt install mysql-server -y
在安装成功之后,试着连接mysql服务器
mysql -uroot -proot
如果是第一次通过mysql客户端工具连接mysql服务器,可能会出现连接不成功。此时查看用户名和口令。
> cd /etc/mysql
> sudo cat debian.cnf
[client]
host = localhost
user = debian-sys-maint
password = QCmROFHEIL2pyMUR
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = QCmROFHEIL2pyMUR
socket = /var/run/mysqld/mysqld.sock
在此文件中,使用user为debian-sys-maint, 口令使用QCmROFHEIL2pyMUR, 则使用mysql服务器命令如下:
> mysql -u debian-sys-maint -pQCmROFHEIL2pyMUR
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.26-0ubuntu0.18.04.1 (Ubuntu)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
二、 配置root用户
2.1 修改root的口令和host
mysql> use mysql;
打开mysql的库, 可以使用 show databases; 命令查看所有的数据库。
进入mysql库之后,可以查看库中的所有表(show tables),其中有一个user表,表示数据库系统的用户表,下面的语句是查看当前DB系统中所有的用户信息。
mysql> select user, host, authentication_string from user;
查看用户名、host主机, authentication_string授权口令(密文)。发现root用户没有口令。以下命令修改root 的host和口令。
mysql> update user set
> host='%', authentication_string=password('root')
> where user='root';
2.2 授权root可以被远程连接
将所有的库下所有对象的权限都授予root用户,命令如下:
mysql> grant all privileges on *.* to 'root'@'%'
> identified by 'root';
刷新权限
mysql> flush privileges;
2.3 重启mysql服务器
mysql> exit
退出mysql的连接。
> sudo service mysql restart
或者使用systemctl命令重启mysql服务器
> sudo systemctl restart mysql
2.4 使用root用户连接
> mysql -uroot -proot
mysql>
正常情况下,则会连接成功。
三、配置远程连接及字符集
3.1 查看当前mysql下的字符集
mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.03 sec)
如果character_set_database 和 character_set_server两个设置不是utf8,则修改服务端和客户端的配置文件。
3.2 配置服务端的文件
服务器的配置文件位置: /etc/mysql/mysql.conf.d/mysqld.cnf
打开这个文件,在[mysqld] 下方添加字符集, 另外,修改bind_address为0.0.0.0 表示任意当前宿主机(mysql服务器安装的当前OS)的IP地址。
> sudo vi /etc/msyql/mysql.conf.d/mysqld.cnf
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server = utf8 # 配置服务器的字符集
bind-address = 0.0.0.0 # 任意的、当前的主机地址
3.3 重启服务
> sudo service mysql restart
3.4 使用python脚本测试远程数据库连接
确定当前python环境中安装了 pymysql库,如果没有安装,则执行下面的命令来安装
> pip install pymysql
如果当前没有python的环境,可以安装一个virtualenv,然后创建一个python的环境。
> sudo apt install virtualenv -y
> cd ~
> virtualenv venv -p python3
> source venv/bin/activate
(venv) > pip install pymysql
(venv) > vi t_db.py
t_db.py文件的内容如下:
import pymysql
conn = pymysql.Connect(
'host': '10.36.174.110',
'port': 3306,
'user': 'root',
'password': 'root',
'db': 'mysql',
'charset': 'utf8'
)
print('Connected!')
执行python脚本
(venv)> python t_db.py
四、库和表的管理
4.1 创建、修改和删除库
创建库的命令如下:
CREATE DATABASE db_name [default character set utf8;
db_name表示创建数据库的名称, 一般情况下,不区分大小写。
可以通过以下命令查看当前数据库管理系统(RDBMS)中支持的引擎。
mysql> show engines;
案例1: 创建 “水果商店库” fruit, 字符集设置为utf8.
create database fruit default character set utf8;
将fruit库的字符集修改成gb2312。
alter database fruit default character set utf8;
查看创建数据库的语句
show create database fruit;
删除数据库
drop database fruit;
4.2 创建表及字段类型
4.2.1 创建表的语法
create table table_name(
field_name field_type[(length)] [约束],
field_name2 ...,
) [ engine=InnoDB|MyISAM] [DEFAULT CHARSET=utf8 ]
table_name 指定表名,见名思义。如 t_user, t_order, app_user, os_user, 同类名相似。
field_name 指定字段名, 又称之为属性名.
field_type 字段类型, 常用类型: integer, int, float, varchar,char, date, time, timestamp, text, clob, blob。
约束, 表示对列值的判别,如主键 primary key、唯一 unique、不为空 not null, 外键 foreign key , 默认值 default, 自增 auto_increment 必须与y主键和integer组合使用。
engine 表示数据库的引擎, 不同的引擎表示库的功能(事务性)是不同的,即不同的业务场景使用不同的数据库引擎,一般情况下使用InnoDB。
4.2.2 案例
-
创建课程表
表名 course,
字段: id 课程编号, name 课程名称,teacher 带课老师
分析字段的类型:
id 整型, 主键约束, 自增
name 字符串, 唯一或不能为空
teacher 字符串,不能为空
创建表的sql语句:
create table cource( id integer primary key auto_increment, name varchar(20) unique, teacher varchar(20) not null )
-
创建教师表 teacher
字段: id, name, phone, age, sex, photo, info
分析字段:
age 是数值型,
photo 头像 ,保存图片的路径
info 个人简介, 应该是文本类型 Text
创建表的SQL语句:
create table teacher(
id integer primary key auto_increment,
name varchar(20),
phone char(11) unique,
age int,
sex char(1),
photo varchar(100),
info text
);
-
创建 学生表 student和成绩表 score [练习]
学生表的字段分析:
id 学生编号
name 姓名
birthday 出生日志
city 城市 ,默认值为西安
创建学生表的SQL语句
create table student( id integer primary key auto_increment, name varchar(20), birthday date, city varchar(20) default '西安' );
成绩表的字段分析:
sid 学生编号
cid 课程编号
score 课程成绩
创建成绩表的SQL语句
drop table if exists score; create table score( sid integer, cid integer, score float comment '成绩' );
扩展
可以在 用户的home目录下,创建sql脚本, 如~/create_score.sql, 内容如下。在连接mysql同时打开某一库之后,可以通过source命令,执行sql脚本文件中的sql语句。
mysql> source ~/create_score.sql
4.3 修改表
4.3.1 修改字段的语法
alter table table_name
modify 字段名 类型[(长度)] [约束];
如,修改score表的score字段的类型为int, 默认值为60
alter table score
modify score int default 60;
4.3.2 修改表名
alter table table_name rename new_table_name;
如,修改score 表名为t_score
alter table score rename t_score;
4.3.3 修改字段的名称
alter table table_name change 原字段名 新字段名 类型[(长度)] [ 约束]
如, 修改t_score表的score字段名为sc
alter table t_score change score sc;
4.3.4 删除字段
alter table 表名 drop 字段名
如, 删除student表的birthday字段
alter table student drop birthday;
4.3.5 查看表结构
mysql> desc student;
4.3.6 删除表
语法:
drop table [if exists] 表名 ;
如,删除teacher表
drop table teacher;
或
drop table if exists teacher;