1. 程式人生 > >mysql的安裝、C++訪問mysql資料庫、編碼設定問題

mysql的安裝、C++訪問mysql資料庫、編碼設定問題

一.mysql的安裝,這個相對簡單,直接去官網下載mysql安裝程式,就可以完成安裝過程,網上有很多安裝教程,這個沒什麼注意事項。

二、C++訪問mysql,主要是用到mysql定義的標頭檔案,內部定義了各種資料結構和函式,比如MYSQL,MYSQL_RES,MYSQL_ROW,mysql_real_connect等等一系列的結構和函式。這裡要注意的就是將標頭檔案及lib檔案以及dll檔案配置到當前開發環境來進行訪問mysql資料庫。

以最新的vs2013作為示例說一下配置過程。為了寫的清晰點,在網上找了幾張圖來說明。

1.要指定mysql所用到的標頭檔案,可以直接將mysql安裝目錄下的include檔案下的標頭檔案拷貝到vs安裝目錄的include目錄下,但是一般我們都是為編譯器指定一個額外的標頭檔案目錄即可。右鍵工程-> properties然後如下圖,在這個附加包含目錄(Additional Include Directory)新增上mysql的include檔案,此檔案在mysql安裝目錄下,例如本人的安裝目錄

C:\Program Files\MySQL\MySQL Server 5.1\include


2.指定mysql的庫檔案

在聯結器的常規下面,附加庫目錄(Additional Liberay Directory)新增上mysql安裝目錄下的lib資料夾的路徑,本人的安裝目錄:

C:\Program Files\MySQL\MySQL Server 5.5\lib

本文作者:csdn  iaccepted 凌風


3.新增額外依賴(AdditionalDependencies),如下圖,指定libmysql.lib,其實就是在上面設定的庫檔案中指定用哪個lib檔案而已。


ok,到這裡環境就配置完成,接下來就可以進行連線mysql並進行資料庫操作。

本文作者:csdn  iaccepted 凌風


在vs2013中新建一個工程,然後根據mysql的官方API就可以完成資料庫操作。

如下:

#include "person.h"
#include <Windows.h>
#include <iostream>
#include <string>
#include <mysql.h>
#include <winsock.h>


using namespace std;

int main(){
	MYSQL *con;
	MYSQL_RES *results;
	MYSQL_ROW record;

	char dbuser[30] = "root";
	char dbpasswd[30] = "123456";
	char dbhost[30] = "localhost";
	char dbname[30] = "person";
	char tname[30] = "person";
	char *query = nullptr;

	con = mysql_init(nullptr);

	if (!mysql_real_connect(con, dbhost, dbuser, dbpasswd, dbname, 3306, NULL, 0)){
		cerr << "Failed to connect database" << endl;
		exit(2);
	}


	mysql_set_character_set(con, "gbk");
	
	mysql_query(con, "insert into person(id, name) values('370983198811256977', '個')");

	mysql_query(con, "select name,id from person where id = '370983198811256977'");

	results = mysql_store_result(con);

	cout << mysql_num_fields(results) << endl;

	while ((record = mysql_fetch_row(results))){
		cout << record[0] << endl;
	}
	
	mysql_close(con);
	return 0; 
}

正常情況下編譯並執行就可以了。

但是有的時候會提示

main.obj : error LNK2019: unresolved externalsymbol [email protected] referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol [email protected] referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol [email protected] referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol [email protected] referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol [email protected] referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol [email protected] referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol [email protected] referenced in function _main

1>main.obj : error LNK2019: unresolved external [email protected] referenced in function _main

意思就是說這些符號都無法找到從而導致連結失敗。

很明顯編譯是正常的只是連結失敗,首先回去檢查上面的三項設定是否對了,如果沒有錯誤的話可能是與系統的版本有關,比如說你用的是64為的windows系統,但是建立工程建立的卻是32位的工程。這是後同上面一樣,工程(project)右鍵->選項(properties)-> 在屬性頁(property pages)的最上面 有個平臺選擇(platform)然後選擇x64,這樣再回來編譯就ok了

本文作者:csdn  iaccepted 凌風

三、中文亂碼問題

檢視mysql的使用者手冊能發現,mysql進行字元編碼轉換的步驟很明確:

1. MySQL Server收到請求時將請求資料從character_set_client轉換為character_set_connection;

2. 進行內部操作前將請求資料從character_set_connection轉換為內部操作字符集,其確定方法如下:

• 使用每個資料欄位的CHARACTER SET設定值;

• 若上述值不存在,則使用對應資料表的DEFAULT CHARACTER SET設定值(MySQL擴充套件,非SQL標準);

• 若上述值不存在,則使用對應資料庫的DEFAULT CHARACTER SET設定值;

• 若上述值不存在,則使用character_set_server設定值。

3. 將操作結果從內部操作字符集轉換為character_set_results。

一般情況下我們將mysql的預設編碼設定為utf8格式,然後在在客戶端進行操作,當有中文操作時,我們先更改客戶端的編碼比如改為gbk,然後進行插入讀取,這時候mysql在接受到資料時發現是gbk編碼的,如上會將gbk編碼轉換成character_set_server編碼的資料進行存入,在這裡也就是將gbk轉換為utf8。讀取的時候mysql會自動將讀取的結果從內部字符集轉換為character_set_results指定的編碼,即從uft8轉換為gbk從而不會產生編碼問題。

以上轉換為自動進行的過程,程式設計師要做的只是設定好內部編碼格式以及客戶端編碼格式即可,這裡的客戶端是廣義的,既可以指command lineclint 也可以只應用程式,說白了就是任何要訪問mysql的東西統稱為客戶端,如上面例子中的程式碼,C++程式作為客戶端時,因為要操作中文,所以首先使用

mysql_set_character_set(con,"gbk");

將客戶端編碼設定為gbk,這樣存入的中文mysql會進行轉換而成為utf8格式,讀取的時候mysql又會從utf8格式轉換成gbk返回給客戶端。

檢視以上各編碼的命令

  1. mysql> SHOW VARIABLES LIKE 'character%'; 
就可以看到character_set_server、character_set_connection、character_set_results等的值。

主要是理解上述所說的mysql字元編碼轉換的步驟,這樣就能控制不會出現亂碼問題。

本文作者:csdn  iaccepted 凌風

相關推薦

no