之前在学校学习的是sqlserver2008,后来又在亚信实习使用Oracle,近期因为毕设项目,我选择了火热的MySQL,一下是使用中的一些记录;
MySQL的安装与初始化有许多教程,不在赘述;
使用MySQL8.0
开始使用MySQL
- 登陆本机的数据库,在本机的命令行输入:
mysql -u root -p
,然后回车并输入密码,不出意外就成功连接上了数据库;(一般登陆数据库使用mysql -h 主机名 -u 用户名 -p
) - 修改密码:在正式使用之前,MySQL要求必须使用初始密码,然而该版本修改密码时,许多命令都提示语法不符合该版本;经历了无数多尝试之后,使用
ALTER user 'root'@'localhost' IDENTIFIED BY 'root';
终于修改成功。(mysql要求每句命令必须有分号:;
,不然就认为该指令未结束) - 在正式开始使用之前,使用
SHOW DATABASES;
查看有哪些数据库;(information_schema、mysql、performance_schema和sys是系统库,不要去改动它们。)
数据库操作
- 然后我们创建一个数据库:
CREATE DATABASE product;
(此处及以下以我实际项目为例)
删除一个数据库使用DROP DATABASE 数据库名;
命令,该数据库下的所有表都会被删除; - 接着,对该数据库进行操作,切换到该数据库内:
USE product;
数据表操作
- 切换到某个数据库(我这里是product)后,查看该数据库下的所有数据表:
SHOW TABLES;
; - 首先我们创建一个用户表user,用来存放服务器上所有用户的账号,密码:
CREATE TABLE user(
user_id INT NOT NULL AUTO_INCREMENT, //定义列自增,用于主键
user_name VARCHAR(100) NOT NULL,
user_password VARCHAR(40) NOT NULL,
submission_date DATE, //提交的时间
PRIMARY KEY(user_id) //设置主键
)ENGINE=InnoDB DEFAULT CHARSET=utf8; //ENGINE 设置存储引擎,CHARSET 设置编码。
删除一个数据表可以使用:DROP TABLE user;
8. 修改一个表的结构:
// 增加一个列名:
ALTER TABLE user ADD COLUMN age VARCHAR(10) NOT NULL;
//修改增加的age列,把列名改为birth:
ALTER TABLE user CHANGE COLUMN age birth VARCHAR(20) NOT NULL;
// 删除列birth:
ALTER TABLE userDROP COLUMN birth;
- 如果要查看一个表的结构,使用
DESC user
,甚至我们可以查看创建该表的语句:SHOW CREATE TABLE user;
node连接MySQL
- 在这里,我新添加了一个用户,用于对nodjs的连接并控制其权限:
// 使用mysql 数据库
USE mysql
// 为mysql创建用户:nodejs 密码为:password12345
CREATE USER nodejs IDENTIFIED BY 'password12345';
// 查看下用户nodejs的权限
SELECT * FROM USER WHERE USER='nodejs' ;
SHOW GRANTS FOR nodejs;
// 给用户nodejs在数据库名为product上赋INSERT,SELECT,UPDATE权限,@'%'表示从任意ip都可以访问到这个数据库
GRANT EXECUTE,INSERT,SELECT,UPDATE ON nodejs.* TO 'case_dev'@'%';
// 生效
FLUSH PRIVILEGES;
// 再次查询 下权限
SELECT * FROM USER WHERE USER='nodejs' ;
SHOW GRANTS FOR nodejs;
- 安装mysql模块:
npm install mysql
- 连接mysql
const mysql = require('mysql');
let connection = mysql.createConnection({
host : 'localhost',
user : 'nodejs',
password : 'password12345',
database : 'product'
});
connection.connect(function(err) {
if (err) {
console.error('连接失败: ' + err.stack);
return;
}
console.log('连接成功 id ' + connection.threadId);
});
connection.end(function(err) { //结束连接
});
此处有坑:
- 运行此代码后,弹出
Unhandled rejection Error: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
错误,大概意思就是未处理拒绝错误:错误:ER_NOT_SUPPORTED_AUTH_MODE:客户端不支持服务器请求的身份验证协议; 考虑升级MySQL客户端
,经过一番艰苦卓越,才搞清楚是因为MySQL8默认是严格加密模式,于是,修改加密规则为普通模式 - 进入root用户权限下,修改加密规则:
ALTER USER 'nodejs'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
,然后更新密码(可省略):ALTER USER 'nodejs'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
,在刷新一下权限就好了:FLUSH PRIVILEGES;
- 注意: 在填坑的修改加密规则处
'nodejs'@'%'
,其中%要与系统用户表的host字段值相同,忘记创建用户时设的值,可以输入use mysql;
,select user,host from user;
命令查看。