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

來源:互聯網
上載者:User

標籤:nullptr   錯誤   base   error   使用   text   方法   亂碼問題   技術分享   

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

 

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

以最新的vs2013作為示範範例說一下配置過程。

為了寫的清晰點,在網上找了幾張圖來說明。

 

1.要指定mysql所用到的標頭檔。能夠直接將mysql安裝資料夾下的include檔案下的標頭檔複製到vs安裝資料夾的include檔案夾下,可是一般我們都是為編譯器指定一個額外的標頭檔檔案夾就可以。右鍵project-> 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檔案而已。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSUFjY2VwdGVk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >


ok,到這裡環境就配置完畢,接下來就能夠進行串連mysql並進行資料庫操作。

本文csdn  iaccepted 淩風


在vs2013中建立一個project,然後依據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系統,可是建立project建立的卻是32位的project。

這是後同上面一樣,project(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格式。然後在在client進行操作。當有中文操作時。我們先更改client的編碼比方改為gbk,然後進行插入讀取,這時候mysql在接受到資料時發現是gbk編碼的,如上會將gbk編碼轉換成character_set_server編碼的資料進行存入。在這裡也就是將gbk轉換為utf8。讀取的時候mysql會自己主動將讀取的結果從內部字元集轉換為character_set_results指定的編碼,即從uft8轉換為gbk從而不會產生編碼問題。

以上轉換為自己主動進行的過程,程式猿要做的僅僅是設定好內部編碼格式以及client編碼格式就可以,這裡的client是廣義的。既能夠指command lineclint 也能夠僅僅應用程式,說白了就是不論什麼要訪問mysql的東西統稱為client。如上面範例中的代碼。C++程式作為client時,由於要操作中文,所以首先使用

mysql_set_character_set(con,"gbk");

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

 

查看以上各編碼的命令

  1. mysql> SHOW VARIABLES LIKE ‘character%‘; 
就能夠看到character_set_server、character_set_connection、character_set_results等的值。


 

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

 

本文csdn  iaccepted 淩風


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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.