字符編碼修正系統(tǒng)及方法
【專利摘要】本發(fā)明涉及互聯(lián)網(wǎng)【技術(shù)領(lǐng)域】,公開了一種字符編碼修正系統(tǒng),包括:數(shù)據(jù)庫連接取出單元,適于接收客戶端的SQL語句,從連接池中取出數(shù)據(jù)庫連接;數(shù)據(jù)庫訪問單元,適于在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫;數(shù)據(jù)庫連接釋放單元,適于在執(zhí)行完所述SQL語句后釋放所述數(shù)據(jù)庫連接至所述連接池。本發(fā)明還公開了一種字符編碼修正方法。本發(fā)明能夠使得客戶端在其字符編碼狀態(tài)與數(shù)據(jù)庫連接的字符編碼狀態(tài)相同時(shí)訪問數(shù)據(jù)庫,并在執(zhí)行完當(dāng)前的SQL語句后立即釋放該數(shù)據(jù)庫連接,達(dá)到了既能避免字符編碼不一致導(dǎo)致的亂碼,又能保證連接池內(nèi)所有連接的有效復(fù)用的有益效果。
【專利說明】字符編碼修正系統(tǒng)及方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及互聯(lián)網(wǎng)【技術(shù)領(lǐng)域】,具體涉及一種字符編碼修正系統(tǒng)及方法。
【背景技術(shù)】
[0002]MySQL數(shù)據(jù)庫的數(shù)據(jù)存儲(chǔ)也支持多種字符編碼(字符編碼:為了用二進(jìn)制表示各種字母、文字、符號(hào)等,人們制定了各種字符編碼方式,通過各種事先定義好的二進(jìn)制串來表示各個(gè)字符。信息的讀出和寫入必須使用相同的編碼方式,才不會(huì)造成亂碼,如GB2312用兩個(gè)字節(jié)表示一個(gè)漢字,而UTF-8用三個(gè)字節(jié)表示一個(gè)漢字,如果寫入一個(gè)用GB2312編碼的漢字,讀出后再用UTF-8編碼去解析,就只能得到錯(cuò)誤的結(jié)果),如:GBK、UTF-8等。為此MySQL專門提供了設(shè)置字符編碼的語句:SET NAMES,如SET NAMES GBK,就將當(dāng)前的字符編碼設(shè)置成了 GBK,之后的讀寫都按照GBK編碼進(jìn)行。
[0003]字符編碼狀態(tài)是與數(shù)據(jù)庫連接綁定的,也就是說,在多個(gè)連接上設(shè)置的不同編碼互不影響。例如:兩個(gè)客戶端,分別連接到同一臺(tái)MySQL數(shù)據(jù)庫服務(wù)器,然后分別執(zhí)行SETNAMES GBK和SET NAMES UTF8,之后兩個(gè)客戶端分別以GBK和UTF-8編碼來讀寫數(shù)據(jù),互不沖突。
[0004]在沒有連接池(每一次數(shù)據(jù)訪問請(qǐng)求都必須經(jīng)歷建立數(shù)據(jù)庫連接、打開數(shù)據(jù)庫、存取數(shù)據(jù)和關(guān)閉數(shù)據(jù)庫連接等步驟,而連接并打開數(shù)據(jù)庫是一件既消耗資源又費(fèi)時(shí)的工作,如果頻繁發(fā)生這種數(shù)據(jù)庫操作,系統(tǒng)的性能必然會(huì)急劇下降。數(shù)據(jù)庫連接池技術(shù)是在存取數(shù)據(jù)操作完成后,并不關(guān)閉數(shù)據(jù)庫連接,而是將其存儲(chǔ)起來,下個(gè)數(shù)據(jù)庫請(qǐng)求就可以直接使用這個(gè)連接,通過復(fù)用已建立的數(shù)據(jù)庫連接,極大地節(jié)省系統(tǒng)資源和時(shí)間)時(shí),每個(gè)客戶端建立一個(gè)到MySQL的連接并獨(dú)占該連接,客戶端一在自己的連接上執(zhí)行SET NAMES語句不會(huì)影響到客戶端二的連接上的編碼狀態(tài)。而在引入連接池后,問題變得有些復(fù)雜,因?yàn)楝F(xiàn)在客戶端不再獨(dú)占一個(gè)連接,而是每執(zhí)行完一條SQL語句,所使用過的連接就被放回連接池,一個(gè)客戶端要執(zhí)行下一條SQL語句,連接池再取出一個(gè)建立好的連接給其使用。換句話說,同一個(gè)客戶端執(zhí)行的多條SQL語句所使用的連接不一定是同一個(gè),而是每執(zhí)行完一條語句,連接就被更換。這樣做目的是為了連接池內(nèi)的連接可以被有效復(fù)用,提升連接的整體利用效率。
[0005]但由于字符編碼的狀態(tài)與連接綁定,因此客戶端一在執(zhí)行某條SQL語句時(shí)使用的很可能是客戶端二執(zhí)行過SET NAMES語句的連接,這樣就會(huì)導(dǎo)致客戶端一錯(cuò)誤地使用UTF-8編碼去讀寫GBK編碼的數(shù)據(jù),后果就是亂碼。
[0006]現(xiàn)有技術(shù)中,一種防止出現(xiàn)亂碼的解決方案是部分取消連接的復(fù)用,即一個(gè)客戶端在運(yùn)行期間獨(dú)占一個(gè)連接,直到該客戶端退出后,它占用的連接才被放回連接池。因?yàn)樵谶@個(gè)客戶端運(yùn)行期間包括SET NAMES在內(nèi)的所有SQL語句都在同一個(gè)連接上執(zhí)行,因此可以保證字符編碼的統(tǒng)一,避免出現(xiàn)亂碼的情況。
[0007]顯然上述解決方案的缺點(diǎn)是連接的復(fù)用度大大降低。每個(gè)客戶端在運(yùn)行期間除了執(zhí)行SQL語句還會(huì)處理其他邏輯,也就是說執(zhí)行兩條SQL語句之間存在一定的時(shí)間間隔,如果是完全復(fù)用連接類型的連接池,在該間隔內(nèi)這個(gè)客戶端占用的連接就會(huì)被放回連接池供其他客戶端使用,而在上述解決方案的架構(gòu)中,該連接得不到利用,只能被該客戶端占用不放。只有在該客戶端退出后其占用的連接才能被其他客戶端使用。
【發(fā)明內(nèi)容】
[0008]鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的字符編碼修正系統(tǒng)及方法。
[0009]依據(jù)本發(fā)明的一個(gè)方面,提供了一種字符編碼修正系統(tǒng),包括:
[0010]數(shù)據(jù)庫連接取出單元,適于接收客戶端的SQL語句,從連接池中取出數(shù)據(jù)庫連接;
[0011]數(shù)據(jù)庫訪問單元,適于在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫;
[0012]數(shù)據(jù)庫連接釋放單元,適于在執(zhí)行完所述SQL語句后釋放所述數(shù)據(jù)庫連接至所述連接池。
[0013]可選地,所述數(shù)據(jù)庫訪問單元進(jìn)一步包括:
[0014]字符編碼狀態(tài)設(shè)置單元,適于在所述SQL語句包括設(shè)置字符編碼的語句時(shí),設(shè)置所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼;
[0015]字符編碼狀態(tài)更新單元,適于更新預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼;
[0016]SQL語句發(fā)送單元,適于將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0017]可選地,所述數(shù)據(jù)庫訪問單元進(jìn)一步包括:
[0018]SQL語句發(fā)送單元,適于在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0019]可選地,所述數(shù)據(jù)庫訪問單元進(jìn)一步包括:
[0020]SQL語句插入單元,適于在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)不相同時(shí),在所述SQL語句前插入設(shè)置字符編碼的語句,以形成新的SQL語句;
[0021]SQL語句發(fā)送單元,適于將所述新的SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0022]可選地,通過關(guān)系映射表保存所述客戶端及所述客戶端當(dāng)前字符編碼狀態(tài)。
[0023]根據(jù)本發(fā)明的另一方面,提供了一種字符編碼修正方法,包括步驟:
[0024]接收客戶端的SQL語句,從連接池中取出數(shù)據(jù)庫連接;
[0025]在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫;
[0026]在執(zhí)行完所述SQL語句后釋放所述數(shù)據(jù)庫連接至所述連接池。
[0027]可選地,所述在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫進(jìn)一步包括:
[0028]在所述SQL語句包括設(shè)置字符編碼的語句時(shí),設(shè)置所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼;
[0029]更新預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼;
[0030]將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0031]可選地,所述在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫進(jìn)一步包括:
[0032]在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0033]可選地,所述在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫進(jìn)一步包括:
[0034]在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)不相同時(shí),在所述SQL語句前插入設(shè)置字符編碼的語句,以形成新的SQL語句;
[0035]將所述新的SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0036]可選地,通過關(guān)系映射表保存所述客戶端及所述客戶端當(dāng)前字符編碼狀態(tài)。
[0037]根據(jù)本發(fā)明的字符編碼修正系統(tǒng)及方法,能夠使得客戶端在其字符編碼狀態(tài)與數(shù)據(jù)庫連接的字符編碼狀態(tài)相同時(shí)訪問數(shù)據(jù)庫,并在執(zhí)行完當(dāng)前的SQL語句后立即釋放該數(shù)據(jù)庫連接,由此解決了的現(xiàn)有技術(shù)中為了避免出現(xiàn)亂碼,而使數(shù)據(jù)庫連接的復(fù)用度大大降低的問題,取得了既能避免字符編碼不一致導(dǎo)致的亂碼,又能保證連接池內(nèi)所有連接的有效復(fù)用的有益效果。
[0038]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】。
【專利附圖】
【附圖說明】
[0039]通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
[0040]圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的字符編碼修正方法流程圖;
[0041 ] 圖2示出了圖1中方法具體流程圖;
[0042]圖3示出了兩個(gè)客戶端通過連接池訪問數(shù)據(jù)庫的示意圖;
[0043]圖4示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的字符編碼修正系統(tǒng)結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0044]下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0045]為了避免出現(xiàn)亂碼,又能使數(shù)據(jù)庫連接被有效復(fù)用,本實(shí)施例的字符編碼修正方法流程如圖1所示,包括:
[0046]步驟S110,接收客戶端的SQL語句,從連接池中取出數(shù)據(jù)庫連接。由于是從連接池中隨機(jī)取出一個(gè)空閑的數(shù)據(jù)庫連接,因此,取出的數(shù)據(jù)庫連接的字符編碼狀態(tài)可能和該客戶端的字符編碼狀態(tài)相同,也可能不同。
[0047]步驟S120,在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫。
[0048]該步驟中,要使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同,具體包括以下三種情況:
[0049]一、客戶端在發(fā)送SQL語句至連接池時(shí),可能該SQL語句中就包含設(shè)置字符編碼的語句,即SET NAMES code(如:SET NAMES GBK或SET NAMES UTF8),表示客戶端要顯示修改字符編碼狀態(tài)。因此,在所述SQL語句包括設(shè)置字符編碼的語句時(shí),設(shè)置所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼;并更新預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼。之后將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0050]二、在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0051]三、在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)不相同時(shí),在所述SQL語句前插入設(shè)置字符編碼的語句,即插入SET NAMES cli_code,以形成新的SQL語句。再將所述新的SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0052]其中,可通過關(guān)系映射表保存所述客戶端及所述客戶端當(dāng)前字符編碼狀態(tài),且在每次客戶端顯示修改字符編碼狀態(tài)時(shí),更新客戶端當(dāng)前字符編碼狀態(tài)。
[0053]步驟S130,在執(zhí)行完所述SQL語句后釋放所述數(shù)據(jù)庫連接至所述連接池。執(zhí)行完一條SQL語句后,客戶端會(huì)進(jìn)入其他邏輯處理階段。例如:執(zhí)行完一條SELECT語句,數(shù)據(jù)庫返回查詢到的數(shù)據(jù)后,客戶端會(huì)對(duì)查詢到的數(shù)據(jù)做處理。處理完后,可能得到新的數(shù)據(jù),再將新數(shù)據(jù)插入數(shù)據(jù)庫,這時(shí)再向數(shù)據(jù)庫連接池發(fā)送INSERT語句,從連接池中取出一個(gè)數(shù)據(jù)庫連接(可能和之前SELECT語句使用的數(shù)據(jù)庫連接不同,此時(shí)需執(zhí)行步驟S120)來連接數(shù)據(jù)庫。而在客戶端對(duì)數(shù)據(jù)做處理的這段時(shí)間,之前占用的數(shù)據(jù)庫連接被釋放到連接池中,可以被其它客戶端使用。
[0054]在客戶端通過連接池訪問數(shù)據(jù)庫(MySQL數(shù)據(jù)庫)時(shí),上述流程可以如圖2所示,包括:
[0055]步驟S210,判斷連接池是否接收到客戶端發(fā)來的SQL語句,若是執(zhí)行步驟S220,否則繼續(xù)等待客戶端的SQL語句。
[0056]步驟S220,從連接池中取出一個(gè)數(shù)據(jù)庫連接,通常是隨機(jī)取出一個(gè)空閑的數(shù)據(jù)庫連接,即未被占用的數(shù)據(jù)庫連接。
[0057]步驟S230,判斷客戶端發(fā)來的SQL語句中是否包含SET NAMES code語句,若是,則執(zhí)行步驟S240,否則執(zhí)行步驟S250 ;
[0058]步驟S240,表示客戶端要顯示修改字符編碼狀態(tài),因此,設(shè)置取出的數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼,即置COn_COde為code ;并更新預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼,即置cli_c0de為code。然后跳轉(zhuǎn)執(zhí)行步驟S270。
[0059]步驟S250,判斷cli_code是否和con_code相同,若是,則執(zhí)行步驟S270,否則執(zhí)行步驟S260 ;
[0060]步驟S260,在接收到的SQL語句前插入設(shè)置字符編碼的語句,即插入SET NAMEScli_code,以形成新的SQL語句。
[0061]步驟S270,將SQL語句(有可能是客戶端接收到的SQL語句,也有可能是一條插入的SET NAMES code語句后的SQL語句)發(fā)送到MySQL。
[0062]步驟S280,執(zhí)行完接收到的SQL語句后,將數(shù)據(jù)庫連接釋放至連接池,等待下一次被使用。
[0063]如圖3所示,下面以兩個(gè)客戶端(客戶端一 311和客戶端二 312)通過連接池320訪問MySQL數(shù)據(jù)庫330為例進(jìn)行說明。
[0064]客戶端一 311和客戶端二 312分別使用連接一和連接二執(zhí)行了 SET NAMES GBK語句和SET NAMES UTF8語句,并保存客戶端一 311當(dāng)前的字符編碼狀態(tài)為GBK,客戶端二 312當(dāng)前的字符編碼狀態(tài)為UTF-8,連接一當(dāng)前的字符編碼狀態(tài)為GBK,連接二當(dāng)前的字符編碼狀態(tài)為UTF-8。
[0065]執(zhí)行完SET NAMES code語句后,客戶端一 311使用過的連接一及客戶端二 312使用過的連接二被放回了連接池。現(xiàn)在客戶端一 311要執(zhí)行一個(gè)讀數(shù)據(jù)的SQL語句,從連接池中取出一個(gè)連接給其使用。若取出的是連接一,連接池檢查客戶端一 311和連接一當(dāng)前的字符編碼,發(fā)現(xiàn)二者同為GBK,則直接在連接一上執(zhí)行SQL語句。若取出的是連接二,檢查客戶端一 311和連接二當(dāng)前的字符編碼,發(fā)現(xiàn)前者為GBK,后者為UTF-8,二者不一致,不能直接執(zhí)行讀數(shù)據(jù)的SQL語句,需要在讀數(shù)據(jù)的SQL語句前插入一條SET NAMES GBK語句,把連接二的字符編碼修正為GBK,然后再執(zhí)行讀數(shù)據(jù)的SQL語句,這樣編碼就不會(huì)混亂了。
[0066]本實(shí)施例的字符編碼修正系統(tǒng)及方法,可以使得客戶端在其字符編碼狀態(tài)與數(shù)據(jù)庫連接的字符編碼狀態(tài)相同時(shí)訪問數(shù)據(jù)庫,并在執(zhí)行完當(dāng)前的SQL語句后立即釋放該數(shù)據(jù)庫連接,由此解決了的現(xiàn)有技術(shù)中為了避免出現(xiàn)亂碼,而使數(shù)據(jù)庫連接的復(fù)用度大大降低的問題,取得了既能避免字符編碼不一致導(dǎo)致的亂碼,又能保證連接池內(nèi)所有連接的有效復(fù)用的有益效果。
[0067]本發(fā)明還提供了一種字符編碼修正系統(tǒng)400,如圖4所示,包括:
[0068]數(shù)據(jù)庫連接取出單元410,適于接收客戶端的SQL語句,從連接池中取出數(shù)據(jù)庫連接。
[0069]數(shù)據(jù)庫訪問單元420,適于在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫。其中,可通過關(guān)系映射表保存所述客戶端及所述客戶端當(dāng)前字符編碼狀態(tài)。
[0070]數(shù)據(jù)庫連接釋放單元430,適于在執(zhí)行完所述SQL語句后釋放所述數(shù)據(jù)庫連接至所述連接池。[0071]所述數(shù)據(jù)庫訪問單元420可以進(jìn)一步包括:
[0072]字符編碼狀態(tài)設(shè)置單元,適于在所述SQL語句包括設(shè)置字符編碼的語句時(shí),設(shè)置所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼;
[0073]字符編碼狀態(tài)更新單元,適于更新預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼;
[0074]SQL語句發(fā)送單元,適于將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0075]所述數(shù)據(jù)庫訪問單元420中,SQL語句發(fā)送單元進(jìn)一步適于在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0076]所述數(shù)據(jù)庫訪問單元420還可以進(jìn)一步包括:
[0077]SQL語句插入單元,適于在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)不相同時(shí),在所述SQL語句前插入設(shè)置字符編碼的語句,以形成新的SQL語句;
[0078]所述SQL語句發(fā)送單元進(jìn)一步適于將所述新的SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
[0079]在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
[0080]在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。
[0081]類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循【具體實(shí)施方式】的權(quán)利要求書由此明確地并入該【具體實(shí)施方式】,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
[0082]本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
[0083]此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
[0084]本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP )來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的應(yīng)用匹配消息發(fā)送服務(wù)器中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
[0085]應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。
【權(quán)利要求】
1.一種字符編碼修正系統(tǒng),其包括步驟: 數(shù)據(jù)庫連接取出單元,適于接收客戶端的SQL語句,從連接池中取出數(shù)據(jù)庫連接; 數(shù)據(jù)庫訪問單元,適于在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫; 數(shù)據(jù)庫連接釋放單元,適于在執(zhí)行完所述SQL語句后釋放所述數(shù)據(jù)庫連接至所述連接池。
2.如權(quán)利要求1所述的字符編碼修正系統(tǒng),其中,所述數(shù)據(jù)庫訪問單元進(jìn)一步包括: 字符編碼狀態(tài)設(shè)置單元,適于在所述SQL語句包括設(shè)置字符編碼的語句時(shí),設(shè)置所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼; 字符編碼狀態(tài)更新單元,適于更新預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼; SQL語句發(fā)送單元,適于將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
3.如權(quán)利要求1所述的字符編碼修正系統(tǒng),其中,所述數(shù)據(jù)庫訪問單元進(jìn)一步包括: SQL語句發(fā)送單元,適于在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
4.如權(quán)利要求1所述的字符編碼修正系統(tǒng),其中,所述數(shù)據(jù)庫訪問單元進(jìn)一步包括: SQL語句插入單元,適于在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)不相同時(shí),在所述SQL語句前插入設(shè)置字符編碼的語句,以形成新的SQL語句; SQL語句發(fā)送單元,適于將所述新的SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
5.如權(quán)利要求1~4中任一項(xiàng)所述的字符編碼修正系統(tǒng),其中,通過關(guān)系映射表保存所述客戶端及所述客戶端當(dāng)前字符編碼狀態(tài)。
6.一種字符編碼修正方法,其包括步驟: 接收客戶端的SQL語句,從連接池中取出數(shù)據(jù)庫連接; 在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫; 在執(zhí)行完所述SQL語句后釋放所述數(shù)據(jù)庫連接至所述連接池。
7.如權(quán)利要求6所述的字符編碼修正方法,其中,所述在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫進(jìn)一步包括: 在所述SQL語句包括設(shè)置字符編碼的語句時(shí),設(shè)置所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼; 更新預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)為所述SQL語句中的字符編碼; 將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
8.如權(quán)利要求6所述的字符編碼修正方法,其中,所述在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫進(jìn)一步包括: 在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),將所述SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
9.如權(quán)利要求6所述的字符編碼修正方法,其中,所述在使得所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)相同時(shí),所述客戶端根據(jù)所述數(shù)據(jù)庫連接訪問數(shù)據(jù)庫進(jìn)一步包括: 在所述SQL語句不包括設(shè)置字符編碼的語句,且取出的所述數(shù)據(jù)庫連接的當(dāng)前字符編碼狀態(tài)與預(yù)先保存的所述客戶端當(dāng)前字符編碼狀態(tài)不相同時(shí),在所述SQL語句前插入設(shè)置字符編碼的語句,以形成新的SQL語句; 將所述新的SQL語句通過所述數(shù)據(jù)庫連接發(fā)送到所述數(shù)據(jù)庫,以使所述客戶端訪問所述數(shù)據(jù)庫。
10.如權(quán)利要求6~9中任一項(xiàng)所述的字符編碼修正方法,其中,通過關(guān)系映射表保存所述客戶端及所述客戶端 當(dāng)前字符編碼狀態(tài)。
【文檔編號(hào)】G06F17/30GK103544284SQ201310511883
【公開日】2014年1月29日 申請(qǐng)日期:2013年10月25日 優(yōu)先權(quán)日:2013年10月25日
【發(fā)明者】朱超, 陳飛, 代兵, 王超 申請(qǐng)人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司