这两天在使用nodejs写后台程序,需要连接mysql。
mysql使用的是8.0版本的。遇到的一些问题,在网上搜索解决方案,发现很多都只适用于老版本,所以,我整理了一些8.0版本可以使用的解决方法,方便以后使用。
nodejs程序如下:
var mysql = require('mysql');
//定义连接
var connection = mysql.createConnection({host : 'localhost',user : 'root',password : '123456',port: '3306',database: 'test'
});
//连接开启
connection.connect();
//查询语句
var sql = 'SELECT * FROM web';
//查询开始
connection.query(sql,function (err, result) {if(err){console.log('[SELECT ERROR] - ',err.message);return;}
//输出查询结果console.log('--------------------------SELECT----------------------------');console.log(result);console.log('------------------------------------------------------------\n\n');
});
//连接结束
connection.end();
一、
编译后输出错误:
Client does not support authentication protocol requested by server; consider upgrading MySQL client .
问题原因:我所使用的mysql版本是8.0,而8.0版本的数据库加密方式与5.0不一样。
解决方法:
1、show databases;–显示所有数据库
2、use mysql;–使用mysql数据库
3、show tables;–显示所有表(可以跳过这一步)
4、select * from user;(可以跳过这一步)
从上图可以看到,user表中是没有password属性的(8.0的password属性改变了)。所以,网上有人使用
select user,password,host from user;
命令找到password,然后使用
update user set password=old_password(‘your new password’) where user=‘user name’;
命令修改加密方式在8.0是行不通的。所以要使用下一步。
5、
select host,user,plugin,authentication_string from mysql.user;
备注:host为 % 表示不限制ip localhost表示本机使用 plugin非mysql_native_password 则需要修改密码
6、
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘newpassword’; #更新一下用户的密码 root用户密码为newpassword
至此,我的nodejs已经解决这个版本过低的问题了。
二、
不过,随后编译跳出一个新的问题:
Access denied for user ‘root’@‘localhost’ (using password:YES)
问题原因: 经查找资料发现是root帐户默认不开放远程访问权限,所以需要修改一下相关权限。
解决方法:
1、打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件。(window默认安装 my.ini 在C:\ProgramData\MySQL\MySQL Server 5.6)
2、重启MySQL服务。
3、通过命令行cd进入MySQL的BIN目录,输入“mysql -u root -p”(不输入密码),回车即可进入数据库。(Windows默认安装BIN目录为:C:\Program Files\MySQL\MySQL Server 5.6\bin)
4、执行“use mysql;”,使用mysql数据库。
5、 alter user ‘root’@'localhost’IDENTIFIED BY ‘123456’;(我将密码设置为123456,大家可以根据自己的喜好修改)
(网上有执行“update user set password=PASSWORD(“123456”) where user=‘root’;”(修改root的密码)。这在8.0是行不通的,因为8.0中没有password属性。)
6、打开MySQL目录下的my.ini文件,删除最后一行的“skip-grant-tables”,保存并关闭文件。
7、重启MySQL服务。
8、在命令行中输入“mysql -u root -p 123456”,即可成功连接数据库。
至此,我重新编译nodejs文件,可以连接数据库,并且输出数据。