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文件夾下,可是一般我們都是為編譯器指定一個額外的頭文件文件夾就可以。右鍵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文件而已。
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。
查看以上各編碼的命令
- mysql> SHOW VARIABLES LIKE ‘character%‘;
主要是理解上述所說的mysql字符編碼轉換的步驟,這樣就能控制不會出現亂碼問題。
本文作者:csdn iaccepted 淩風
mysql的安裝、C++訪問mysql數據庫、編碼設置問題