MYSQL *
mysql_real_connect(MYSQL *mysql,
const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long client_flag)
mysql_real_connect()
是一个同步函数。它的异步对应函数是 mysql_real_connect_nonblocking()
,供需要与服务器进行异步通信的应用程序使用。参见 第 7 章,C API 异步接口。
要使用 DNS SRV 记录进行连接,请使用 mysql_real_connect_dns_srv()
。参见 第 5.4.59 节,“mysql_real_connect_dns_srv()”。
mysql_real_connect()
尝试建立与运行在 host
上的 MySQL 服务器的连接。客户端程序必须先成功连接到服务器,然后才能执行任何其他需要有效的 MYSQL
连接处理程序结构的 API 函数。
如下指定参数
对于第一个参数,指定现有
MYSQL
结构的地址。在调用mysql_real_connect()
之前,调用mysql_init()
来初始化MYSQL
结构。您可以使用mysql_options()
调用更改许多连接选项。参见 第 5.4.54 节,“mysql_options()”。-
host
的值可以是主机名,也可以是 IP 地址。客户端尝试按如下方式连接-
如果
host
为NULL
或字符串"localhost"
,则假定连接到本地主机在 Windows 上,如果服务器启用了共享内存连接,则客户端使用共享内存连接进行连接。
在 Unix 上,客户端使用 Unix 套接字文件进行连接。
unix_socket
参数或MYSQL_UNIX_PORT
环境变量可用于指定套接字名称。
在 Windows 上,如果
host
为"."
,或者未启用 TCP/IP 且未指定unix_socket
或主机为空,则客户端使用命名管道进行连接(如果服务器启用了命名管道连接)。如果未启用命名管道连接,则会发生错误。否则,将使用 TCP/IP。
您还可以使用
MYSQL_OPT_PROTOCOL
或MYSQL_OPT_NAMED_PIPE
选项来影响与mysql_options()
一起使用的连接类型。连接类型必须受服务器支持。 -
user
参数包含用户的 MySQL 登录 ID。如果user
为NULL
或空字符串""
,则假定为当前用户。在 Unix 下,这是当前登录名。在 Windows ODBC 下,必须显式指定当前用户名。请参阅 连接器和 API 的 Connector/ODBC 部分。-
passwd
参数包含user
的密码。如果passwd
为NULL
,则仅检查user
表中密码字段为空(空)的用户的条目是否匹配。这使得数据库管理员可以设置 MySQL 权限系统,以便用户根据是否指定了密码获得不同的权限。注意不要尝试在调用
mysql_real_connect()
之前加密密码;密码加密由客户端 API 自动处理。 user
和passwd
参数使用已为MYSQL
对象配置的任何字符集。默认情况下,这是utf8mb4
,但可以通过在连接之前调用mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "
来更改。charset_name
")db
是数据库名称。如果db
不为NULL
,则连接会将默认数据库设置为该值。如果
port
不为 0,则该值将用作 TCP/IP 连接的端口号。请注意,host
参数决定了连接的类型。如果
unix_socket
不为NULL
,则该字符串指定要使用的套接字或命名管道。请注意,host
参数决定了连接的类型。-
client_flag
的值通常为 0,但可以设置为以下标志的组合以启用某些功能CAN_HANDLE_EXPIRED_PASSWORDS
:客户端可以处理过期的密码。有关更多信息,请参阅 服务器处理过期密码。CLIENT_COMPRESS
:在客户端/服务器协议中使用压缩。CLIENT_FOUND_ROWS
:返回找到(匹配)的行数,而不是更改的行数。-
CLIENT_IGNORE_SIGPIPE
:防止客户端库安装SIGPIPE
信号处理程序。这可以用来避免与应用程序已安装的处理程序发生冲突。 CLIENT_IGNORE_SPACE
:允许函数名后的空格。使所有函数名成为保留字。CLIENT_INTERACTIVE
:允许在关闭连接之前interactive_timeout
秒的不活动时间(而不是wait_timeout
秒)。客户端会话的wait_timeout
变量设置为会话interactive_timeout
变量的值。CLIENT_LOCAL_FILES
:启用LOAD DATA LOCAL
处理。CLIENT_MULTI_RESULTS
:告诉服务器客户端可以处理来自多语句执行或存储过程的多个结果集。如果启用了CLIENT_MULTI_STATEMENTS
,则会自动启用此标志。有关此标志的更多信息,请参见下表后面的注释。CLIENT_MULTI_STATEMENTS
:告诉服务器客户端可以在单个字符串中发送多个语句(用;
字符分隔)。如果未设置此标志,则禁用多语句执行。有关此标志的更多信息,请参见下表后面的注释。-
CLIENT_NO_SCHEMA
:不允许使用db_name.tbl_name.col_name
语法。这是针对 ODBC 的。如果您使用该语法,它会导致解析器生成错误,这对于捕获某些 ODBC 程序中的错误很有用。从 MySQL 8.0.32 开始,
CLIENT_NO_SCHEMA
标志已弃用。客户端程序可以省略此标志和db
参数,以使连接将数据库值设置为当前(或默认)数据库。 CLIENT_ODBC
:未使用。CLIENT_OPTIONAL_RESULTSET_METADATA
:此标志使结果集元数据可选。抑制元数据传输可以提高性能,特别是对于执行许多查询且每个查询返回的行数很少的会话。有关管理结果集元数据传输的详细信息,请参阅 第 3.6.7 节,“可选结果集元数据”。CLIENT_SSL
:使用 SSL(加密协议)。不要在应用程序程序中设置此选项;它在客户端库中内部设置。而是在调用mysql_real_connect()
之前使用mysql_options()
。CLIENT_REMEMBER_OPTIONS
:记住通过调用mysql_options()
指定的选项。如果没有此选项,如果mysql_real_connect()
失败,则必须在再次尝试连接之前重复mysql_options()
调用。使用此选项,则无需重复mysql_options()
调用。
如果您的程序使用 CALL
语句执行存储过程,则必须启用 CLIENT_MULTI_RESULTS
标志。这是因为,除了由过程中执行的语句可能返回的任何结果集之外,每个 CALL
还会返回一个结果以指示调用状态。因为 CALL
可以返回多个结果,所以请使用调用 mysql_next_result()
来确定是否有更多结果的循环来处理它们。
您可以在调用 mysql_real_connect()
时启用 CLIENT_MULTI_RESULTS
,可以通过传递 CLIENT_MULTI_RESULTS
标志本身来显式启用,也可以通过传递 CLIENT_MULTI_STATEMENTS
(这也将启用 CLIENT_MULTI_RESULTS
)来隐式启用。CLIENT_MULTI_RESULTS
默认情况下处于启用状态。
如果启用 CLIENT_MULTI_STATEMENTS
或 CLIENT_MULTI_RESULTS
,请使用调用 mysql_next_result()
来确定是否有更多结果的循环,为每次调用 mysql_real_query()
或 mysql_query()
处理结果。有关示例,请参见第 3.6.3 节“多语句执行支持”。
对于某些参数,可以从选项文件中获取值,而不是从 mysql_real_connect()
调用中的显式值获取值。为此,请在调用 mysql_real_connect()
之前使用 MYSQL_READ_DEFAULT_FILE
或 MYSQL_READ_DEFAULT_GROUP
选项调用 mysql_options()
。然后,在 mysql_real_connect()
调用中,为要从选项文件中读取的每个参数指定 “无值” 值。
对于
host
,请指定值NULL
或空字符串 (""
)。对于
user
,请指定值NULL
或空字符串。对于
passwd
,请指定值NULL
。(对于密码,mysql_real_connect()
调用中空字符串的值不能在选项文件中被覆盖,因为空字符串明确指示 MySQL 帐户必须具有空密码。)对于
db
,请指定值NULL
或空字符串。对于
port
,请指定值 0。对于
unix_socket
,请指定值NULL
。
如果在选项文件中没有找到参数的值,则将使用其默认值,如本节前面说明中所示。
-
无法连接到 MySQL 服务器。
-
无法连接到本地 MySQL 服务器。
-
无法创建 IP 套接字。
-
内存不足。
-
无法创建 Unix 套接字。
-
无法找到主机名的 IP 地址。
-
尝试使用使用不同协议版本的客户端库连接到服务器时,导致协议不匹配。
-
无法在 Windows 上创建命名管道。
-
无法在 Windows 上等待命名管道。
-
无法在 Windows 上获取管道处理程序。
-
如果
connect_timeout
> 0 并且连接到服务器花费的时间超过了connect_timeout
秒,或者如果服务器在执行init-command
时崩溃。 -
MYSQL
连接处理程序已连接。
MYSQL mysql;
mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
}
通过使用 mysql_options()
,MySQL 客户端库将读取 my.cnf
文件中的 [client]
和 [your_prog_name]
部分。这使您能够将选项添加到 [your_prog_name]
部分,以确保您的程序正常工作,即使有人以某种非标准方式设置了 MySQL。