我一直在处理这个问题,我找不到解决方案。 我无法使用mysql_real_connect()从C(fedora24)连接到mariadb。它始终失败,用户拒绝访问,错误代码1045,SQL状态28000
互联网上提出的所有解决方案都与错误的密码,错误的界面(例如localhost而不是127.0.0.1)或权限有关,因此人们无法使用sql客户端进行连接。 但事实是,我可以使用sql客户端,我的用户以及root连接。我只是不能用C功能。使用mysql -u -p既适用于root用户,也适用于我的用户(userdb)。我甚至使用phpMyAdmin,它适用于两个用户。
我明确连接到127.0.0.1,使用TCP套接字而不是Unix套接字,以便使用Wireshark监视消息。响应总是:
MySQL Protocol
Packet Length: 72
Packet Number: 2
Error Code: 1045
SQL state: 28000
Error message: Access denied for user 'root'@'localhost' (using password: YES)
root和localhost更改,具体取决于我使用root,userdb还是不同的接口。
如果我检查用户和密码,我就有这个:
MariaDB [mysql]> select user,host,password from mysql.user;
+--------+-----------+-------------------------------------------+
| user | host | password |
+--------+-----------+-------------------------------------------+
| root | localhost | *B94FFB596FCEC97E64467B3274F7C739C42FFA7A |
| root | 127.0.0.1 | *B94FFB596FCEC97E64467B3274F7C739C42FFA7A |
| root | ::1 | *B94FFB596FCEC97E64467B3274F7C739C42FFA7A |
| userdb | % | *A2CF089828EE5EEA40C84C6454E97650B87345A9 |
+--------+-----------+-------------------------------------------+
我最简单的测试是:
void finish_with_error( MYSQL *con )
{
fprintf( stderr, "%s\n", mysql_error( con ) );
mysql_close( con );
exit( EXIT_FAILURE );
}
int main( int argc, char **argv )
{
MYSQL *con = mysql_init( NULL );
if ( con == NULL )
{
fprintf( stderr, "%s\n", mysql_error( con ) );
exit( EXIT_FAILURE );
}
if ( mysql_real_connect( con, "127.0.0.1", "root", "asd8814*",
"mysql", 0, NULL, 0 ) == NULL )
{
finish_with_error( con );
}
有什么想法吗?
提前致谢。
路易斯
******** UPDATE *********
因为我确定权限和密码都没问题,因为我可以连接phyMyAdmin和mysql客户端,所以我开始检查密码验证。在我看来,这是唯一遗留下来的,只会导致C客户端而不是其他客户端出现问题。 Mariadb和我的C客户端都使用mysql_native_password,因为我可以使用Wireshark进行验证。
我删除了MariaDB中该用户的密码并成功连接。 之后我使用phpMyAdmin创建了一个新密码,但仍然成功连接。 可能看起来我的密码错了,但是,为什么我可以用phpMyAdmin和mysql客户端连接?
我用root用户重复了这个过程。我可以用root连接到phpMyAdmin,所以我删除了root@127.0.0.1的密码,但仍然无法从C连接。我删除了root @ localhost的密码,然后连接了C客户端。
第一个问题:如果我用127.0.0.1而不是localhost调用mysql_real_connect(),为什么它在root @ localhost上没有密码连接(我确认我使用的是使用Wireshark的TCP)
第二个问题:我使用phpMyAdmin为root @ localhost重新创建了相同的密码,现在C客户端也可以连接(如同mysql客户端和phpMyAdmin一样)。
这些问题的未知答案。我不知道为什么密码验证以前没有用,为什么它现在有效。