Oracle字符集配置配合rails的實(shí)際運(yùn)用
以下的文章主要講述的是如何配合rails的Oracle字符集配置,其中包括Oracle字符集配置先決條件的介紹,還有可變的條件的相關(guān)介紹,你如果對(duì)其相關(guān)的操作感興趣的話,以下的文章,你一定不要錯(cuò)過(guò)。
Oracle中文字符顯示的問題
rails2..02 中對(duì)頁(yè)面表單提交,單個(gè)中文字的問題
Rails默認(rèn)的設(shè)置適合于MySQL,但我的工作環(huán)境往往是Oracle,于是需要針對(duì)Oracle重新進(jìn)行配置。
下載和安裝Oralce Rails庫(kù),需要給Rails應(yīng)用所在的服務(wù)器安裝Oracle的客戶端;
更改config/database.yml文件,基本的配法如下:
ruby 代碼
- Oracle:
- adapter: oci
- username: rails
- password: rails
- host: 10.11.16.63/ORCL
相信用過(guò)Oracle的人都很容易理解上面的字段和格式的含義。另外說(shuō)一下,冒號(hào)后一定要留一個(gè)空格,否則在執(zhí)行ruby script/server時(shí)就會(huì)報(bào)錯(cuò)。
基本連接的配置就是這樣了,但對(duì)一個(gè)中國(guó)的開發(fā)人員來(lái)說(shuō),通常情況下,新的框架、新的數(shù)據(jù)庫(kù)配置一般會(huì)帶來(lái)字符編碼的問題。
Oracle字符集配置
先絕條件1: Rails默認(rèn)使用UTF-8字符集保存文件,暫時(shí)不考慮修改成GBK。
先絕條件2: Oralce服務(wù)器使用AMERICAN _ AMERICA.zhs16gbk編碼,是一個(gè)公共的開發(fā)環(huán)境,因此除非迫不得已,不考慮對(duì)編碼進(jìn)行調(diào)整。
可變的條件: Rails應(yīng)用所在服務(wù)器的Oracle客戶端字符集,當(dāng)前也是ZHS16GBK,但可以調(diào)整。
按照現(xiàn)在的配置,運(yùn)行rails,進(jìn)行中文信息的填寫、提交、顯示。發(fā)現(xiàn)不錯(cuò),在web上顯示的一切正常。但是,用常用的toad登錄Oralce,一看全部顯示亂碼。即使用Oracle自帶的那個(gè)java寫的客戶端連上去,也是顯示亂碼。
有的帖子里面寫了把客戶端的nls_lang設(shè)置的和服務(wù)器一樣,就能解決亂碼問題。前面的條件也符合這種要求,web上的顯示也確實(shí)正確。但是數(shù)據(jù)庫(kù)客戶端顯示不正常,顯然不讓人接受,以后萬(wàn)一要導(dǎo)數(shù)據(jù)等等,那就會(huì)麻煩很多。
于是開始嘗試各種解決辦法,直到看見了這篇關(guān)于Oracle字符集的文章,才算豁然開朗。
Oracle字符集配置問題其實(shí)牽涉到3個(gè)概念:操作系統(tǒng)字符集(輸入/顯示),客戶端字符集,數(shù)據(jù)庫(kù)字符集。
"客戶端字符集就是為了讓數(shù)據(jù)庫(kù)知道我們傳遞過(guò)去的字符是屬于那種字符集,以便于Oracle在存儲(chǔ)字符(數(shù)據(jù)庫(kù)字符集)時(shí)做相應(yīng)的編碼映射。" 操作系統(tǒng)字符集其實(shí)就是輸入/顯示的字符,在rails中輸入就是就是rails提交的編碼,顯示則是由瀏覽器根據(jù)編碼進(jìn)行解析.
簡(jiǎn)單地說(shuō),先決條件1就是輸入字符集,先決條件2就是數(shù)據(jù)庫(kù)字符集,而可變的條件就是客戶端字符集。之前,在客戶端和數(shù)據(jù)庫(kù)端都是ZHS16GBK的情況下,web能成功顯示,是因?yàn)楸4婧腿〕龅亩际莡tf-8編碼的字符,而數(shù)據(jù)庫(kù)自己查看失敗就在于在nls_lang=ZHS16GBK的情況下,無(wú)法正確解析實(shí)際是按utf-8存放的內(nèi)容。
簡(jiǎn)單地把客戶端字符集設(shè)置和數(shù)據(jù)庫(kù)一致,僅僅實(shí)現(xiàn)了數(shù)據(jù)(按utf-8編碼)的透?jìng)鳌6娴囊寯?shù)據(jù)在庫(kù)中以數(shù)據(jù)庫(kù)字符集編碼形式保存,需要將客戶端字符集改成和輸入字符集一致的字符集。因此,如果Rails輸入的信息是UTF-8,那么應(yīng)該將Rails應(yīng)用服務(wù)器的Oracle客戶端設(shè)置成 nls_lang=UTF8。
如此的話,客戶端字符集讓數(shù)據(jù)庫(kù)知道我們傳遞過(guò)去的字符是屬于哪種字符集,以便于Oracle在存儲(chǔ)字符時(shí)做相應(yīng)的編碼映射,這樣數(shù)據(jù)就按數(shù)據(jù)庫(kù)字符集被保存了。
***還要說(shuō)的一個(gè)問題,就是nls_lang=AMERICAN_AMERICA.UTF8在哪里進(jìn)行設(shè)置。
在windows下,可以在注冊(cè)表下以及dos窗口里面設(shè)置。在注冊(cè)表下設(shè)置的話,除影響Rails外,還會(huì)影響toad以及Oracle自帶的客戶端。而此時(shí),web一切正常,Oracle自帶的客戶端查看數(shù)據(jù)也正常,但是toad的顯示還是不正常。
換成在啟動(dòng)Rails前先執(zhí)行 set nls_lang=AMERICAN_AMERICA.UTF8 ,這樣把影響局限在Rails應(yīng)用中,注冊(cè)表中依舊采用ZHS16GBK,那么web、toad、Oracle自帶客戶端就全都正常了。更進(jìn)一步,set nls_lang=AMERICAN_AMERICA.UTF8 可以放入rails目錄下的use_ruby.cmd,這樣就會(huì)自動(dòng)設(shè)置這個(gè)變量了。
綜上所述,對(duì)于Rails來(lái)說(shuō),如果選擇按UTF8來(lái)進(jìn)行數(shù)據(jù)的傳遞,那么只要存入/獲取的數(shù)據(jù)都是UTF8編碼的,在web上就能一切正常。透?jìng)鞯脑挷挥绊慠ails的正常工作,但保存數(shù)據(jù)的字符集就未必是數(shù)據(jù)庫(kù)的字符集了。
客戶端字符集變量的作用就是告訴數(shù)據(jù)庫(kù)傳的信息是按什么編碼的,然后數(shù)據(jù)庫(kù)就能做相應(yīng)的轉(zhuǎn)換,按數(shù)據(jù)庫(kù)自己的字符集進(jìn)行存放,而在取出時(shí)也能做相應(yīng)的轉(zhuǎn)換。所以說(shuō),需要將客戶端字符集改成和輸入字符集一致。
【編輯推薦】
- Oracle數(shù)據(jù)庫(kù)緩沖區(qū)命中率的概述
- Oracle 權(quán)限入門如何管理
- Oracle索引整理的詳細(xì)描述
- Oracle創(chuàng)建Split 與Map 函數(shù)的代碼示例
- Oracle 字符串split的相關(guān)實(shí)際應(yīng)用代碼介紹

















