[路飞]mysql初体验

198 阅读5分钟

mysql -- 版本 8.0.27

前言:

并不会深入数据库,只是了解前后端交互流程,然后写一些项目demo。

安装

MySQL :: MySQL Community Downloads

在官网下载之后,几乎是一直next,需要设置密码,要记住密码,不然改起来很多坑。

困难

ps: 版本 8.0.27

因为忘记了当时安装时设置了什么密码,连接不了数据库,一上来就给我难住了。然后网上查了很久,一些文章的思路是对的,但就是不起效果,甚至还出错了。

  1. 上来第一个坑,遇到了 net stop mysqlnet 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)

  2. 初始化的问题,我当时就只是安装了,并没有初始化,在安装目录下没找到 data 文件夹,查了一下才发现要初始化。mysqld --initialize --console,这个命令可以多次执行,只要运行时安装目录下面没有 data文件夹就行。初始化会打印很多东西,在最后会有一句 [Server] A temporary password is generated for root@localhost: xxxxx, 这个 xxxxx随机生成的初始密码我用这个初始密码也没登录上去

  3. 改密码的方法。坑的地方是一直没有跳过密码验证进入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> 时就可以使用了。

  4. 不知道从哪个版本开始改了,我用的是 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为要设置的新密码。如果不做这一步,就是空密码状态,也能用。

  5. mysql 和我们平时用命令行不一样,如果结尾没有 ; 就不会执行,一直换行。

经过一番折腾,终于连接上数据库了。属实不容易。

使用

首先下载图形化客户端, MySQL Workbench

在里面建表的过程就不详细说了,都是图形化界面。

我们会建立一个 user 表,里面有 idusername

接下来是和 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 和一个列表。

0.jpg

1.jpg

以上就是 mysql 的初次体验,感觉还挺不错,就是有亿点坑。