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 Socket 檔案進行連線。
unix_socket引數或MYSQL_UNIX_PORT環境變數可用於指定 Socket 名稱。
在 Windows 上,如果
host為".",或者未啟用 TCP/IP 且未指定unix_socket或主機為空,則如果伺服器已啟用具名管道連線,則用戶端會使用具名管道進行連線。如果未啟用具名管道連線,則會發生錯誤。否則,會使用 TCP/IP。
您也可以使用
mysql_options()的MYSQL_OPT_PROTOCOL或MYSQL_OPT_NAMED_PIPE選項來影響要使用的連線類型。伺服器必須支援連線類型。 -
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,則該字串會指定要使用的 Socket 或具名管道。請注意,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。