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

來源:互聯網
上載者:User

一.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 _mysql_num_fields@4 referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol _mysql_set_character_set@8 referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol _mysql_init@4 referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol _mysql_real_connect@32 referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol _mysql_query@8 referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol _mysql_store_result@4 referenced in function _main

1>main.obj : error LNK2019: unresolved externalsymbol _mysql_fetch_row@4 referenced in function _main

1>main.obj : error LNK2019: unresolved external symbol_mysql_close@4 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 淩風


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.