使用MySQL C语言API连接Ubuntu 22.04上MySQL 8.0.36报错求助
解决MySQL C API连接时找不到socket的问题
问题原因
你的MySQL服务实际使用的socket路径并非C API默认查找的/tmp/mysql.sock,但命令行和Python客户端会自动读取MySQL配置文件(如/etc/mysql/my.cnf或~/.my.cnf)中的socket路径,因此能正常连接。
解决方案
1. 确认MySQL实际socket路径
先执行以下命令获取MySQL当前使用的socket路径:
mysql -u test -p -e "SHOW VARIABLES LIKE 'socket'"
输出示例:
+---------------+-----------------------------+ | Variable_name | Value | +---------------+-----------------------------+ | socket | /var/run/mysqld/mysqld.sock | +---------------+-----------------------------+
2. 方法一:在C代码中指定正确的socket路径
修改mysql_real_connect函数的第7个参数(socket路径)为上面获取到的实际路径:
int main() { MYSQL *conn; const char *server = "localhost"; const char *user = "test"; const char *password = "password"; const char *database = "test1"; // 替换为你的实际socket路径 const char *socket_path = "/var/run/mysqld/mysqld.sock"; conn = mysql_init(NULL); if (!mysql_real_connect(conn, server, user, password, database, 0, socket_path, 0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(conn)); return 1; } return 0; }
3. 方法二:改用TCP/IP连接(绕过socket)
将server改为127.0.0.1,并指定默认端口3306,强制使用TCP连接而非Unix socket:
int main() { MYSQL *conn; const char *server = "127.0.0.1"; const char *user = "test"; const char *password = "password"; const char *database = "test1"; unsigned int port = 3306; conn = mysql_init(NULL); if (!mysql_real_connect(conn, server, user, password, database, port, NULL, 0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(conn)); return 1; } return 0; }
4. 方法三:创建软链接到默认路径
如果不想修改代码,可通过软链接将实际socket路径指向C API默认查找的/tmp/mysql.sock:
sudo ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock # 确保权限允许进程访问 sudo chown mysql:mysql /tmp/mysql.sock
内容的提问来源于stack exchange,提问作者Andy Sun
相关产品推荐
相关产品推荐

