我正在关注dev.mysql提供的Connect / C ++教程。在复制示例并成功编译并链接它之后,我遇到了以下问题:
在抛出'sql :: SQLException'
的实例后终止调用what():无法连接到'127.0.0.1'(111)
上的MySQL服务器
据我所知111
代表权限被拒绝。
以下是取自here并略有修改的示例代码:
#include <mysql_driver.h>
int main()
{
auto driver = sql::mysql::get_mysql_driver_instance();
auto con = driver->connect("tcp://127.0.0.1:0", "root", "123");
delete con;
}
尝试使用tcp://127.0.0.1:3306
会得到相同的结果。
这是CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)
project(mysql_try)
set(CMAKE_CXX_STANDARD 14)
set(SOURCE_FILES main.cpp)
add_executable(mysql_try ${SOURCE_FILES})
target_include_directories(mysql_try PUBLIC /usr/local/include/mysql++)
target_link_libraries(mysql_try mysqlclient /usr/local/lib/libmysqlcppconn-static.a pthread dl)
我可以使用代码中的凭据轻松运行mysql
。我禁用了网络,因此它只能在localhost
上收听。正在运行
mysql> SHOW GLOBAL VARIABLES LIKE 'PORT';
给了我0,所以我猜它是0号端口。
C连接器和命令行界面工作正常。
我的操作系统是ubuntu 16.04。
答案 0 :(得分:2)
我禁用了网络,因此它只能侦听localhost。
在一起禁用网络(tcp)和指定tcp仅在您的环回适配器(127.0.0.1)上侦听之间存在区别。你的mysql客户端几乎肯定是通过Unix Socket连接,而不是TCP连接,这就是为什么工作正常。通过运行mysql --protocol tcp
来验证。如果失败,那么您知道您一起禁用了TCP连接,并且它通过Unix Socket连接。
连接(&#34; TCP://127.0.0.1:0&#34;
如果您确实禁用了skip-networking
网络,则需要更改connect()
以引用您的套接字文件。见the docs
UNIX://路径名
此URL格式允许使用Unix域套接字文件连接到Unix和类Unix系统上的本地主机。 path_name值是套接字文件路径名,就像MySQL客户端的--socket选项一样,例如在Unix上运行的mysql和mysqladmin(请参阅连接到MySQL服务器)。
使用以下命令查找您的套接字:
的MySQL&GT;显示全球变量类似于&#39; socket&#39;
如果您想保持连接字符串不变,请删除skip-networking
,然后添加
bind-address = 127.0.0.1
那应该解决它!