在 Python 語言環(huán)境下我們這樣連接數(shù)據(jù)庫。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,獨山企業(yè)網(wǎng)站建設,獨山品牌網(wǎng)站建設,網(wǎng)站定制,獨山網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,獨山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
In [1]: from mysql import connector
In [2]: cnx = connector.connect(host="172.16.192.100",port=3306,user="appuser",password="xxxxxx")
但是連接數(shù)據(jù)庫的背后發(fā)生了什么呢?
答案
當我們通過驅(qū)動程序(mysql-connector-python,pymysql)連接 MySQL 服務端的時候,就是把連接參數(shù)傳遞給驅(qū)動程序,驅(qū)動程序再根據(jù)參數(shù)會發(fā)起到 MySQL 服務端的 TCP 連接。當 TCP 連接建立之后驅(qū)動程序與服務端之間會按特定的格式和次序交換數(shù)據(jù)包,數(shù)據(jù)包的格式和發(fā)送次序由?MySQL 協(xié)議?規(guī)定。MySQL 協(xié)議:整個連接的過程中 MySQL 服務端與驅(qū)動程序之間,按如下的次序發(fā)送了這些包。
MySQL 服務端向客戶端發(fā)送一個握手包,包里記錄了 MySQL-Server 的版本,默認的授權(quán)插件,密碼鹽值(auth-data)。
2. MySQL 客戶端發(fā)出 ssl 連接請求包(如果有必要的話)。
3. MySQL 客戶端發(fā)出握手包的響應包,這個包時記錄了用戶名,密碼加密后的串,客戶端屬性,等等其它信息。
4. MySQL 服務端發(fā)出響應包,這個包里記錄了登錄是否成功,如果沒有成功也會給出錯誤信息。
1、配置ODBC數(shù)據(jù)源。
2、使用SQL函數(shù)進行連接。
對于1、配置數(shù)據(jù)源,配置完以后就可以編程操作數(shù)據(jù)庫了。
對于2、使用SQL函數(shù)進行連接,參考代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#includewindows.h
#includesql.h
#includesqlext.h
void main()
{
HENV henv; //環(huán)境句柄
HDBC hdbc; //數(shù)據(jù)源句柄
HSTMT hstmt; //執(zhí)行語句句柄
unsigned char datasource[]="數(shù)據(jù)源名稱"; //即源中設置的源名稱
unsigned char user[]= "用戶名"; //數(shù)據(jù)庫的帳戶名
unsigned char pwd[]= "密碼"; //數(shù)據(jù)庫的密碼
unsigned char search[]="select xm from stu where xh=0";
SQLRETURN retcode; //記錄各SQL函數(shù)的返回情況
// 分配環(huán)境句柄
retcode= SQLAllocEnv(henv); // 等介于 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL
, henv);
// 設置ODBC環(huán)境版本號為3.0
retcode= SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 分配連接句柄
retcode= SQLAllocConnect(henv,hdbc); // 等介于 SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc);
//設置連接屬性,登錄超時為*rgbValue秒(可以沒有)
// SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);
//直接連接數(shù)據(jù)源
// 如果是windows身份驗證,第二、三參數(shù)可以是
一般都用第三方管理軟件,比如MySQL Tools for 5.0
你要是想在控制臺連接數(shù)據(jù)庫的話,設置一下環(huán)境變量就隨便打開個控制臺就能訪問了。
將MySQL安裝目錄的bin目錄設置到環(huán)境變量Path中,比如:"C:\Program Files\MySQL\MySQL Server 5.0\bin"
然后在控制臺中按格式輸入信息就可以對數(shù)據(jù)庫進行操作了。
格式:mysql --user=用戶名 --password=密碼 [數(shù)據(jù)庫名]
調(diào)用mysql數(shù)據(jù)庫API。
去官網(wǎng)下載mysql c API庫文件,然后安裝一下,每個調(diào)用數(shù)據(jù)庫的函數(shù)都有相關(guān)解釋,直接參照函數(shù)解釋進行編程就行了。
注意編寫makefile的時候把相關(guān)依賴庫加入
使用MySQL,安全問題不能不注意。以下是MySQL提示的23個注意事項:
1。如果客戶端和服務器端的連接需要跨越并通過不可信任的網(wǎng)絡,那么就需要使用SSH隧道來加密該連接的通信。
2。用set password語句來修改用戶的密碼,三個步驟,先“mysql -u root”登陸數(shù)據(jù)庫系統(tǒng),然后“mysql update mysql.user set password=password('newpwd')”,最后執(zhí)行“flush privileges”就可以了。
3。需要提防的攻擊有,防偷聽、篡改、回放、拒絕服務等,不涉及可用性和容錯方面。對所有的連接、查詢、其他操作使用基于ACL即訪問控制列表的安全措施來完成。也有一些對SSL連接的支持。
4。除了root用戶外的其他任何用戶不允許訪問mysql主數(shù)據(jù)庫中的user表;
加密后存放在user表中的加密后的用戶密碼一旦泄露,其他人可以隨意用該用戶名/密碼相應的數(shù)據(jù)庫;
5。用grant和revoke語句來進行用戶訪問控制的工作;
6。不使用明文密碼,而是使用md5()和sha1()等單向的哈系函數(shù)來設置密碼;
7。不選用字典中的字來做密碼;
8。采用防火墻來去掉50%的外部危險,讓數(shù)據(jù)庫系統(tǒng)躲在防火墻后面工作,或放置在DMZ區(qū)域中;
9。從因特網(wǎng)上用nmap來掃描3306端口,也可用telnet server_host 3306的方法測試,不能允許從非信任網(wǎng)絡中訪問數(shù)據(jù)庫服務器的3306號TCP端口,因此需要在防火墻或路由器上做設定;
10。為了防止被惡意傳入非法參數(shù),例如where ID=234,別人卻輸入where ID=234 OR 1=1導致全部顯示,所以在web的表單中使用''或""來用字符串,在動態(tài)URL中加入%22代表雙引號、%23代表井號、%27代表單引號;傳遞未檢 查過的值給mysql數(shù)據(jù)庫是非常危險的;
11。在傳遞數(shù)據(jù)給mysql時檢查一下大小;
12。應用程序需要連接到數(shù)據(jù)庫應該使用一般的用戶帳號,只開放少數(shù)必要的權(quán)限給該用戶;
13。在各編程接口(C C++ PHP Perl Java JDBC等)中使用特定‘逃脫字符’函數(shù);
在因特網(wǎng)上使用mysql數(shù)據(jù)庫時一定少用傳輸明文的數(shù)據(jù),而用SSL和SSH的加密方式數(shù)據(jù)來傳輸;
14。學會使用tcpdump和strings工具來查看傳輸數(shù)據(jù)的安全性,例如tcpdump -l -i eth0 -w -src or dst port 3306 | strings。以普通用戶來啟動mysql數(shù)據(jù)庫服務;
15。不使用到表的聯(lián)結(jié)符號,選用的參數(shù) --skip-symbolic-links;
16。確信在mysql目錄中只有啟動數(shù)據(jù)庫服務的用戶才可以對文件有讀和寫的權(quán)限;
17。不許將process或super權(quán)限付給非管理用戶,該mysqladmin processlist可以列舉出當前執(zhí)行的查詢文本;super權(quán)限可用于切斷客戶端連接、改變服務器運行參數(shù)狀態(tài)、控制拷貝復制數(shù)據(jù)庫的服務器;
18.file權(quán)限不付給管理員以外的用戶,防止出現(xiàn)load data '/etc/passwd'到表中再用select 顯示出來的問題;
19。如果不相信DNS服務公司的服務,可以在主機名稱允許表中只設置IP數(shù)字地址;
20。使用max_user_connections變量來使mysqld服務進程,對一個指定帳戶限定連接數(shù);
21.grant語句也支持資源控制選項;
22。啟動mysqld服務進程的安全選項開關(guān),--local-infile=0 或1 若是0則客戶端程序就無法使用local load data了,賦權(quán)的一個例子grant insert(user) on mysql.user to 'user_name'@'host_name';若使用--skip-grant-tables系統(tǒng)將對任何用戶的訪問不做任何訪問控制,但可以用 mysqladmin flush-privileges或mysqladmin reload來開啟訪問控制;默認情況是show databases語句對所有用戶開放,可以用--skip-show-databases來關(guān)閉掉。
23。碰到Error 1045(28000) Access Denied for user 'root'@'localhost' (Using password:NO)錯誤時,你需要重新設置密碼,具體方法是:先用--skip-grant-tables參數(shù)啟動mysqld,然后執(zhí)行 mysql -u root mysql,mysqlupdate user set password=password('newpassword') where user='root';mysqlFlush privileges;,最后重新啟動mysql就可以了。