mysql -- 版本 8.0.27
前言:
并不会深入数据库,只是了解前后端交互流程,然后写一些项目demo。
安装
MySQL :: MySQL Community Downloads
在官网下载之后,几乎是一直next,需要设置密码,要记住密码,不然改起来很多坑。
困难
ps: 版本 8.0.27
因为忘记了当时安装时设置了什么密码,连接不了数据库,一上来就给我难住了。然后网上查了很久,一些文章的思路是对的,但就是不起效果,甚至还出错了。
-
上来第一个坑,遇到了
net stop mysql和net start mysql这两个命令报错了。原因是服务里面没有MySQL。需要在 mysql安装目录的bin目录下,运行命令行窗口mysqld --install安装服务。安装成功会打印Service successfully installed.。这时就可以随意使用这两句命令了。-
如果出问题了可以使用
mysqld --remove进行卸载然后重新安装服务。但是要注意关掉 mysql 相关的东西,服务也关掉。不然会出现卸载不干净,安装时报错“指定的服务已被标记为删除”。 -
如果安装服务不成功,可以使用
sc query mysql,如果有打印东西就是还没卸载干净, 使用sc delete mysql进行卸载,不成功时注意有没有关掉引用着 mysql 服务相关的东西,因为会卡着的。 -
需要检查一下服务里面,如果服务里面注册了 MySQL 的地址不是
\安装目录\bin\mysqld的话。需要在注册表里面改一下。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL,修改ImagePath为本地安装mysql bin地址。(不知道注册表入口的可以 win + r, 输入 regedit)
-
-
初始化的问题,我当时就只是安装了,并没有初始化,在安装目录下没找到
data文件夹,查了一下才发现要初始化。mysqld --initialize --console,这个命令可以多次执行,只要运行时安装目录下面没有data文件夹就行。初始化会打印很多东西,在最后会有一句[Server] A temporary password is generated for root@localhost: xxxxx, 这个xxxxx是随机生成的初始密码,但我用这个初始密码也没登录上去。 -
改密码的方法。坑的地方是一直没有跳过密码验证进入mysql去重置密码,试了好多个。
-
先停掉 MySQL 服务,用第 1 点的命令也行,服务必须注册了。
-
在管理员方式运行的 cmd 窗口 输入
mysqld --console --skip-grant-tables --shared-memory如果没配置环境变量需要在安装目录的bin目录下打开cmd。 -
如果打印了一大段话并且命令行处在运行中的状态,最后打印有这么一句
[Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: ready for connections. Version: '8.0.27' socket: '' port: 0 MySQL Community Server - GPL.说明是成功的跳过了密码验证。这个命令的效果是起一个mysql服务,这个服务不需要密码。 -
这时打开一个新的窗口,输入
mysql -u root -p会弹出需要输入密码,这时直接回车就可以了,然后会进入 mysql。 和在命令行输入node后一样。 命令行出现 mysql> 时就可以使用了。
-
-
不知道从哪个版本开始改了,我用的是 8.* 版本,然后
password被改成了authentication_string。 命令里面输password就会报错。网上的文章都有问题。-
进入数据库后,
select host,user,authentication_string from mysql.user可以查看密码,应该是需要一些解密之后才看到具体的。 -
update mysql.user set authentication_string='' where user='root'将密码设置为空。 -
成功之后
quit退出。 -
把前面跳过验证启动的服务给关掉 ctrl + c
-
net start mysql
-
这时再进去
mysql -u root -p,也是直接回车不用输密码,因为设置为空了。 -
这一步可以做也可以不做。进去之后
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'xxx为要设置的新密码。如果不做这一步,就是空密码状态,也能用。
-
-
mysql 和我们平时用命令行不一样,如果结尾没有
;就不会执行,一直换行。
经过一番折腾,终于连接上数据库了。属实不容易。
使用
首先下载图形化客户端, MySQL Workbench 。
在里面建表的过程就不详细说了,都是图形化界面。
我们会建立一个 user 表,里面有 id 和 username。
接下来是和 node 连接起来。
我们用到了 mysql2 这个库,服务器用轻量的 Koa。
yarn add mysql2 koa
// or
npm i mysql2 koa
接下来简单的搭一个服务器。
const Koa = require('koa')
const app = new Koa()
app.use(async ctx => {
ctx.body = `<h1></h1>`
})
app.listen(3000)
接下来接入 mysql2 。更多的api可以去看官方文档。
const mysql = require('mysql2/promise') // 考虑到可读性所以使用 Promise 版本的api
let connection = null
// 再请求的时候建立与数据库的连接
app.use(async (ctx, next) => {
if (!connection) {
connection = await mysql.createConnection({
host: 'localhost',
user: 'root',
password: '****', // 数据库的密码
database: 'user_db' // 建立的 Schema 的名字
})
}
await next()
})
app.use(async ctx => {
// 通过这个 sql 语句,进行查询,返回的结果是一个二维数组,第一个是我们查询的结果,第二个是查询时的一些配置。
const [user] = connection.query('SELECT * FROM `user_db`.user')
console.log(users) /* 可以打印看一下 */
// 简单的展示就没有用模板框架,自己拼了 li
ctx.body = `
<h1>hello</h1>
<ul>
${users.reduce((a, b) => {
return a + `<li>${b.id}--${b.username}</li>`
}, '')}
</ul>
`
})
最后启动服务器,浏览 http://localhost:3000/。
我们会看到 hello 和一个列表。
以上就是 mysql 的初次体验,感觉还挺不错,就是有亿点坑。