今天用MFC连接mysql数据库,发现老是连接不上,把代码贴在控制台程序下运行,又可以运行,很奇怪。后来我把异常打印出来:Client does not support authentication protocol requested by server; consider upgrading MySQL client。在网上查了下,说是mysql新旧版本的密码算法不同引起的,用下面两种方法可以解决:
1)MySQL->SET PASSWORD FOR 'some_user'@'some_host'=OLD_PASSWORD('new_password');
MySQL->FLUSH PRIVILEGES;
2)MySQL->UPDATE MySQL.user SET Password=OLD_PASSWORD('new_password') WHERE Host='some_host' AND User='some_user';
MySQL->FLUSH PRIVILEGES;
MySQL 4.1/5.0 是通过 PASSWORD 加密的。我想了下,可能是我下的libmsyql.dll动态链接库是别人的,而别人的版本和我现在的版本不同,所以出现上面的情况。
连接mysql的代码大概如下:
unsigned short Port = 3306;
CString IPAddress = "localhost";
CString UserName = "xxx";
CString Password = "123";
CString DBName = "mydb";
unsigned long i;
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
mysql_init(&mysql);
CString error;
if(&mysql == NULL)
{
error.Format("Error: %s\n ", mysql_error(&mysql));
AfxMessageBox(error);
return ;
}
AfxMessageBox("MySQL mysql init OK. \n");
if(!mysql_real_connect(&mysql, IPAddress, UserName, Password, DBName, Port , NULL, 0))
{
error.Format("Error: %s\n ", mysql_error(&mysql));
AfxMessageBox(error);
return ;
}
AfxMessageBox("MySQL connnect OK. \n");
if(mysql_query(&mysql,"SELECT * FROM user"))
{
error.Format("Error: %s\n ", mysql_error(&mysql));
AfxMessageBox(error);
}
if( !(res = mysql_store_result(&mysql)) )
{
error.Format("Error: %s\n ", mysql_error(&mysql));
AfxMessageBox(error);
}
while( (row = mysql_fetch_row(res)) )
{
for(i=0 ; i<mysql_num_fields(res); i++)
{
CString s = row[i];
AfxMessageBox(s);
}
}
mysql_free_result(res);
if(mysql_query( &mysql,"insert into user SET name=\aabbcc\'"))
{
error.Format("Error: %s\n ", mysql_error(&mysql));
AfxMessageBox(error);
}
mysql_close(&mysql);