亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼

瀏覽:3日期:2023-11-30 17:39:33
; ; 6.8 其他主題 ; 本節(jié)包括幾個(gè)主題,這些主題不完全適合于本章從client1到client5 的開(kāi)發(fā)中的任一小節(jié)的內(nèi)容: ; ■ 在使用結(jié)果集元數(shù)據(jù)幫助驗(yàn)證這些數(shù)據(jù)適合于計(jì)算之后,使用結(jié)果集數(shù)據(jù)計(jì)算結(jié)果。 ; ■ 如何處理很難插入到查詢(xún)中的數(shù)據(jù)。 ; ■ 如何處理圖形數(shù)據(jù)。 ; ■ 如何獲得表結(jié)構(gòu)的信息。 ; ■ 常見(jiàn)的MySQL程序設(shè)計(jì)錯(cuò)誤及如何避免。 ; 6.8.1在結(jié)果集上執(zhí)行計(jì)算 ; 迄今為止,我們集中而主要地使用了結(jié)果集元數(shù)據(jù)來(lái)打印行數(shù)據(jù),但很明顯,除打印之外,還有需要使用數(shù)據(jù)做其他事情的時(shí)候。例如,計(jì)算基于數(shù)據(jù)值的統(tǒng)計(jì)信息,應(yīng)用元數(shù)據(jù)確保數(shù)據(jù)適合它們要滿(mǎn)足的需求。哪種類(lèi)型的需求?對(duì)于啟動(dòng)程序來(lái)說(shuō),可能要校驗(yàn)一下正要執(zhí)行數(shù)字計(jì)算的列實(shí)際上是否包含著數(shù)字! ; 下面的列表顯示了一個(gè)簡(jiǎn)單函數(shù)summary _ stats ( ) ,它獲取結(jié)果集和列索引,并產(chǎn)生列值的匯總統(tǒng)計(jì)。該函數(shù)還列出缺少數(shù)值的數(shù)量,它是通過(guò)檢查NULL 來(lái)檢測(cè)的。這些計(jì)算包括兩個(gè)數(shù)據(jù)所必須滿(mǎn)足的需求, summary_stats() 用結(jié)果集元數(shù)據(jù)來(lái)校驗(yàn): ; ■ 指定的列必須存在(也就是說(shuō),列索引必須在結(jié)果集列值的范圍內(nèi))。 ; ■ 此列必須包括數(shù)字值。 ; 如果這些條件不滿(mǎn)足,則summary_stats() 只打印出錯(cuò)誤消息并返回。代碼如下:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 請(qǐng)注意在mysql_fetch_row() 循環(huán)前面調(diào)用的mysql_ data _ seek( )。為獲得同樣的結(jié)果集,它允許多次調(diào)用summary _ stats()(假設(shè)要計(jì)算幾列的統(tǒng)計(jì)值的話(huà))。每次調(diào)用summary _ stats( )都要“重新回到”到結(jié)果集的開(kāi)始(這里假設(shè)mysql_store_result() 創(chuàng)建結(jié)果集,如果用mysql_use_result() 創(chuàng)建結(jié)果集就只能按順序處理行,而且只能處理一次)。summary_stats() 是個(gè)相對(duì)簡(jiǎn)單的函數(shù),但它給我們一個(gè)提示,就是如何編寫(xiě)一個(gè)比較復(fù)雜的計(jì)算程序,如兩個(gè)列的最小二乘回歸或者標(biāo)準(zhǔn)統(tǒng)計(jì),如t -檢驗(yàn)。 ; 6.8.2 對(duì)查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 ; 包括引號(hào)、空值和反斜線(xiàn)的數(shù)據(jù)值,如果把它們插入到查詢(xún)中,在執(zhí)行查詢(xún)時(shí)就會(huì)產(chǎn)生一些問(wèn)題。下面的討論論述了這些難點(diǎn),并介紹了解決的辦法。假設(shè)要建造一個(gè)SELECT 查詢(xún),它基于由name 指向的空終結(jié)串的內(nèi)容:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼  如果name 的值類(lèi)似于“0’Malley, Brian”,這時(shí)進(jìn)行的查詢(xún)就是非法的,因?yàn)橐?hào)在引用的字符串里出現(xiàn):Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 需要特別注意這個(gè)引號(hào),以便使服務(wù)器不將它解釋為name 的結(jié)尾。一種方法是在字符串內(nèi)使用雙引號(hào),這就是ANSI SQL 約定。SQL 支持這個(gè)約定,也允許引號(hào)在反斜線(xiàn)后使用:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 另一個(gè)有問(wèn)題之處是查詢(xún)中任意二進(jìn)制數(shù)據(jù)的使用,例如,在把圖形存儲(chǔ)到數(shù)據(jù)庫(kù)這樣的應(yīng)用程序中會(huì)發(fā)生這種情況。因?yàn)槎M(jìn)制數(shù)值含有一些字符,把它放到查詢(xún)中是不安全的。為了解決這個(gè)問(wèn)題,可使用mysql_ escape _ string( ),它可以對(duì)特殊字符進(jìn)行編碼,使其在引用的字符串中可以使用。mysql_escape_string() 認(rèn)為的特殊字符是指空字符、單引號(hào)、雙引號(hào)、反斜線(xiàn)、換行符、回車(chē)符和C ontrol - Z(最后一個(gè)在Windows 語(yǔ)言環(huán)境中出現(xiàn))。什么時(shí)候使用mysql_escape_string() 呢?最保險(xiǎn)的回答是“始終”。然而,如果確信數(shù)據(jù)的形式并且知道它是正確的—可能因?yàn)轭A(yù)先執(zhí)行了確認(rèn)檢查—就不必編碼了。例如,如果處理電話(huà)號(hào)碼的字符串,它完全由數(shù)字和短線(xiàn)組成,那么就不必調(diào)用mysql_ escape _ string( )了,否則還是要調(diào)用。 ; mysql_escape_string() 對(duì)有問(wèn)題的字符進(jìn)行編碼是將它們轉(zhuǎn)換為以反斜線(xiàn)開(kāi)頭的2個(gè)字符的序列。例如,空字符轉(zhuǎn)換為‘ 0’,這里的0 是可打印的ASCII 碼0,而不是空。反斜線(xiàn)、單引號(hào)和雙引號(hào)分別轉(zhuǎn)換為‘ ’、‘’’和‘”’。調(diào)用mysql_escape_string() 的過(guò)程如下:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 mysql_escape_string() 對(duì)from_str 進(jìn)行編碼,并把結(jié)果寫(xiě)入to _ str中,還添加了空終結(jié)值,這樣很方便,因?yàn)榭梢岳孟駍trcpy() 和strlen() 這樣的函數(shù)使用該結(jié)果串。from_str 指向包括將要編碼的字符串的char 緩沖區(qū),這個(gè)字符串可能包含任何內(nèi)容,其中包括二進(jìn)制數(shù)據(jù)。to_str 指向一個(gè)存在的char 緩沖區(qū),在這個(gè)緩沖區(qū)里,可以寫(xiě)入編碼的字符串;不要傳遞未初始化的指針或NULL 指針,希望由mysql_escape_string() 分配空間。由to_str 指向的緩沖區(qū)的長(zhǎng)度至少是(from_len*2)+1個(gè)字節(jié)(很可能from_str 中的每個(gè)字符都需要用2 個(gè)字符來(lái)編碼;額外的字節(jié)是空終結(jié)值)。 ; from_len 和to_len 都是unsigned int 值,from_len 表示from_str 中數(shù)據(jù)的長(zhǎng)度;提供這個(gè)長(zhǎng)度是非常必要的,因?yàn)閒rom_str 可能包含空值字節(jié),不能把它當(dāng)作空終結(jié)串。從mysql_escape_string() 返回的to_len 值是作為結(jié)果的編碼字符串的實(shí)際長(zhǎng)度,沒(méi)有對(duì)空終結(jié)值進(jìn)行計(jì)數(shù)。 ; 當(dāng)mysql_escape_string() 返回時(shí), to _ str中編碼的結(jié)果就可看作是空終結(jié)串,因?yàn)閒rom_str 中的空值都被編碼為‘ 0’。為了重新編寫(xiě)構(gòu)造SELECT 的代碼,使名稱(chēng)的值即使包含引號(hào)也能工作,我們進(jìn)行下面的操作:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼6.8.3 圖像數(shù)據(jù)的處理mysql_escape_string() 的基本功能之一就是把圖像數(shù)據(jù)加載到一個(gè)表中。本節(jié)介紹如何進(jìn)行這項(xiàng)工作(這個(gè)討論也適用于二進(jìn)制數(shù)據(jù)的其他形式)。假設(shè)想從文件中讀取圖像,并將它們連同唯一的標(biāo)識(shí)符存儲(chǔ)到表中。BLOB 類(lèi)型對(duì)二進(jìn)制數(shù)據(jù)來(lái)講是個(gè)很好的選擇,因此可以使用下面的表說(shuō)明:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 實(shí)際上,要想從文件中獲取圖像并放入images 表,利用下面的函數(shù)load_image() 可以實(shí)現(xiàn),給出一個(gè)標(biāo)識(shí)符號(hào)碼和一個(gè)指向包括這個(gè)圖像數(shù)據(jù)的打開(kāi)文件的指針:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼load_image() 不會(huì)分配非常大的查詢(xún)緩沖區(qū)( 10 0 K),因此它只能處理相對(duì)較小的圖形。 ; 在實(shí)際的應(yīng)用程序中,可以根據(jù)圖形文件的大小動(dòng)態(tài)地分配緩沖區(qū)。處理從數(shù)據(jù)庫(kù)中恢復(fù)的圖形數(shù)據(jù)(或任何二進(jìn)制數(shù)據(jù))并不像開(kāi)始把它放入時(shí)那樣問(wèn)題重重,因?yàn)樵谧兞縈YSQL_ROW 中數(shù)據(jù)值的原始形式是有效的,通過(guò)調(diào)用mysql_ fetch _length ( ),這個(gè)長(zhǎng)度也是有效的。必須將值看作是計(jì)數(shù)串,而不是空終結(jié)串。 ; 6.8.4 獲取表信息 ; MySQL允許使用下面的查詢(xún)獲取有關(guān)表結(jié)構(gòu)的信息(下面兩者是等價(jià)的):Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 與SELECT 相類(lèi)似,兩個(gè)語(yǔ)句都返回結(jié)果集。為了在表中找出有關(guān)列,所需做的就是處理結(jié)果集中的行,從中獲取有用的信息。例如,如果從mysql客戶(hù)機(jī)上發(fā)布DESCRIBE images 語(yǔ)句,就會(huì)返回這樣的信息:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼  ; 如果從自己的客戶(hù)機(jī)上執(zhí)行同樣的查詢(xún),可以得到相同的信息(沒(méi)有邊框)。如果只想要單個(gè)列的信息,則使用如下這個(gè)查詢(xún):  ; SHOW FIELDS FROM tbl _ name LIKE “col _ name”  ; 此查詢(xún)會(huì)返回相同的列,但只是一行(如果列不存在就不返回行)。  ; 6.8.5 需要避免的客戶(hù)機(jī)程序設(shè)計(jì)錯(cuò)誤  ; 本節(jié)討論一些常見(jiàn)的MySQLC API 程序設(shè)計(jì)錯(cuò)誤,以及如何避免其發(fā)生(這些問(wèn)題在MySQL郵件清單中會(huì)周期性地突然出現(xiàn))。  ; 1. 錯(cuò)誤1——使用未初始化的連接處理程序指針在本章的樣例中,我們已經(jīng)通過(guò)傳遞NULL 參數(shù)調(diào)用了mysql_ i n i t ( ),這就是讓它分配并且初始化MYSQL 結(jié)構(gòu),然后返回一個(gè)指針。另外一種方法是將指針傳遞到一個(gè)已有的MYSQL 結(jié)構(gòu)中。在這種情況下, mysql_init() 會(huì)將結(jié)構(gòu)初始化并返回一個(gè)指針,而不必自己分配結(jié)構(gòu)。如果要使用第二種方法,則要小心會(huì)出現(xiàn)一些微妙的問(wèn)題。下面的討論指出了需要注意的一些問(wèn)題。如果將一個(gè)指針傳遞給mysql_ init( ),它應(yīng)該實(shí)際指向某些東西。看下面的代碼段:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 這個(gè)問(wèn)題是,mysql_init() 得到了一個(gè)指針,但指針沒(méi)有指向所知的任何地方。conn 是一個(gè)局部變量,因此在main() 開(kāi)始執(zhí)行時(shí)它是一個(gè)能指向任何地方的未初始化的存儲(chǔ)器,這就是說(shuō)mysql_init() 將使用指針,并可在內(nèi)存的一些任意區(qū)域?yàn)E寫(xiě)。如果幸運(yùn)的話(huà), conn 將指向您的程序地址空間的外部,這樣,系統(tǒng)將立即終止,使您能盡早意識(shí)到代碼中出現(xiàn)的問(wèn)題。 ; 如果不幸的話(huà), conn 將指向程序中以后才使用的一些數(shù)據(jù)的內(nèi)部,直到再次使用那個(gè)數(shù)據(jù)時(shí)才發(fā)現(xiàn)問(wèn)題。因此實(shí)際出現(xiàn)問(wèn)題的地方遠(yuǎn)比執(zhí)行程序時(shí)出現(xiàn)的問(wèn)題多,也更難捕捉到。下面是一段有問(wèn)題的代碼:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼  ; 此時(shí), conn 是一個(gè)全局變量,因此在程序啟動(dòng)前,將它初始化為0(就是NULL)。mysql_init() 遇到NULL 參數(shù),因此初始化并分配一個(gè)新的連接處理程序。只要將conn 傳遞給需要非NULL 連接處理程序的MySQLCAPI 函數(shù),系統(tǒng)就會(huì)崩潰。這些代碼段的修改就是確保conn 有一個(gè)可知的值。例如,可以將它初始化到已經(jīng)分配的MYSQL 結(jié)構(gòu)地址中去:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 然而,推薦的(較容易的!)解決方案僅僅是將NULL 顯式地傳遞給mysql_ init( ),讓該函數(shù)分配MYSQL 結(jié)構(gòu),并將返回值賦值給conn:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 無(wú)論如何不要忘記檢驗(yàn)mysql_init() 的返回值,以確保它不是NULL。 ; 2. 錯(cuò)誤2——有效結(jié)果集檢驗(yàn)的失敗 ; 請(qǐng)記住檢查希望得到的結(jié)果集的調(diào)用狀態(tài)。下面的代碼沒(méi)有做到這一點(diǎn):Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 不幸地是,如果mysql_store_result() 失敗,res_set 為NULL,while 循環(huán)也不執(zhí)行了,應(yīng)測(cè)試返回結(jié)果集函數(shù)的返回值,以確保實(shí)際上在進(jìn)行工作。 ; 3. 錯(cuò)誤3—— NULL 列值引起的失敗 ; 不要忘記檢查mysql_fetch_row() 返回的數(shù)組MYSQL_ROW 中列值是否為NULL 指針。如果row[i] 為NULL,則在一些機(jī)器上,下面的代碼就會(huì)引起崩潰:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 該錯(cuò)誤危害最大的部分是,有些printf() 的版本很寬容地對(duì)NULL指針輸出了“( null )”,這就使錯(cuò)誤很容易逃脫而沒(méi)有把錯(cuò)誤定位。如果把程序給了朋友,而他只有不太寬容printf( )版本,程序就會(huì)崩潰,您的朋友會(huì)認(rèn)為您是個(gè)無(wú)用的程序員。循環(huán)應(yīng)該寫(xiě)成下面這樣:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 不需要檢查列值是否為NULL 的惟一一次是當(dāng)已經(jīng)從列信息結(jié)構(gòu)確定IS _ NOT _ NULL( )為真時(shí)。 ; 4. 錯(cuò)誤4——傳遞無(wú)意義的結(jié)果緩沖區(qū) ; 需要您提供緩沖區(qū)的客戶(hù)機(jī)庫(kù)函數(shù)通常要使這些緩沖區(qū)真正存在,下面的代碼違反了這個(gè)規(guī)則:Mysql入門(mén)系列:對(duì)MYSQL查詢(xún)中有疑問(wèn)的數(shù)據(jù)進(jìn)行編碼 問(wèn)題是什么呢?to_str 必須指向一個(gè)存在的緩沖區(qū),而在這個(gè)樣例中沒(méi)有,因此,它指向了隨意的位置。不要向mysql_escape_string 傳遞無(wú)意義的指針作為to_str 參數(shù),否則它會(huì)恣意踐踏內(nèi)存。
標(biāo)簽: MySQL 數(shù)據(jù)庫(kù)
主站蜘蛛池模板: 国产精品视频免费播放 | 在线观看视频黄 | 亚洲国产精品自产在线播放 | 国产精品嫩草影视在线观看 | 婷婷六月久久综合丁香乐透 | 亚洲国产97在线精品一区 | 一区二区三区无码高清视频 | 亚洲国产精品看片在线观看 | 黄色激情毛片 | 日本a黄色片 | 国产亚洲欧美久久久久 | 另类重口100页在线播放 | 欧美成人h精品网站 | 亚洲第一黄色网 | 国产成人综合久久精品红 | 欧美日本韩国国产 | 久久久国产99久久国产久 | 网友自拍视频在线观看 | 爱爱永久免费视频网站 | 小黄鸭污视频 | 一级毛片美国aaj毛片 | 美女天堂网 | 国产精品成人va在线观看入口 | 欧美αv日韩αv亚洲αv在线观看 | 亚洲一区二区三区四区在线观看 | 一级做a爰片性色毛片小说 一级做a爰片性色毛片中国 | 国产码欧美日韩高清综合一区 | 日韩经典第一页 | 一级毛片免费在线观看网站 | 91福利国产在线观看一区二区 | 中国一级毛片录像 | 亚洲成人日韩 | 亚洲精品国产一区二区图片欧美 | 国产精品国偷自产在线 | 国产在线观看91精品2021 | 麻豆精品在线播放 | 蜜桃福利视频 | 麻豆视频在线免费看 | 免费一级毛片不卡不收费 | 350gao免费永久视频 | 国产国语在线播放视频 |