以下的文章主要講述的是如何配合rails的Oracle字符集配置,其中包括Oracle字符集配置先決條件的介紹,還有可變的條件的相關介紹,你如果對其相關的操作感興趣的話,以下的文章,你一定不要錯過。
Oracle中文字符顯示的問題
rails2..02 中對頁面表單提交,單個中文字的問題
Rails默認的設置適合於MySQL,但我的工作環境往往是Oracle,於是需要針對Oracle重新進行配置。
下載和安裝Oralce Rails庫,需要給Rails應用所在的服務器安裝Oracle的客戶端;
更改config/database.yml文件,基本的配法如下:
ruby 代碼
- Oracle:
- adapter: oci
- username: rails
- passWord: rails
- host: 10.11.16.63/ORCL
相信用過Oracle的人都很容易理解上面的字段和格式的含義。另外說一下,冒號後一定要留一個空格,否則在執行ruby script/server時就會報錯。
基本連接的配置就是這樣了,但對一個中國的開發人員來說,通常情況下,新的框架、新的數據庫配置一般會帶來字符編碼的問題。
Oracle字符集配置
先絕條件1: Rails默認使用UTF-8字符集保存文件,暫時不考慮修改成GBK。
先絕條件2: Oralce服務器使用AMERICAN _ AMERICA.zhs16gbk編碼,是一個公共的開發環境,因此除非迫不得已,不考慮對編碼進行調整。
可變的條件: Rails應用所在服務器的Oracle客戶端字符集,當前也是ZHS16GBK,但可以調整。
按照現在的配置,運行rails,進行中文信息的填寫、提交、顯示。發現不錯,在web上顯示的一切正常。但是,用常用的toad登錄Oralce,一看全部顯示亂碼。即使用Oracle自帶的那個Java寫的客戶端連上去,也是顯示亂碼。
有的帖子裡面寫了把客戶端的nls_lang設置的和服務器一樣,就能解決亂碼問題。前面的條件也符合這種要求,web上的顯示也確實正確。但是數據庫客戶端顯示不正常,顯然不讓人接受,以後萬一要導數據等等,那就會麻煩很多。
於是開始嘗試各種解決辦法,直到看見了這篇關於Oracle字符集的文章,才算豁然開朗。
Oracle字符集配置問題其實牽涉到3個概念:操作系統字符集(輸入/顯示),客戶端字符集,數據庫字符集。
"客戶端字符集就是為了讓數據庫知道我們傳遞過去的字符是屬於那種字符集,以便於Oracle在存儲字符(數據庫字符集)時做相應的編碼映射。" 操作系統字符集其實就是輸入/顯示的字符,在rails中輸入就是就是rails提交的編碼,顯示則是由浏覽器根據編碼進行解析.
簡單地說,先決條件1就是輸入字符集,先決條件2就是數據庫字符集,而可變的條件就是客戶端字符集。之前,在客戶端和數據庫端都是ZHS16GBK的情況下,web能成功顯示,是因為保存和取出的都是utf-8編碼的字符,而數據庫自己查看失敗就在於在nls_lang=ZHS16GBK的情況下,無法正確解析實際是按utf-8存放的內容。
簡單地把客戶端字符集設置和數據庫一致,僅僅實現了數據(按utf-8編碼)的透傳。而真的要讓數據在庫中以數據庫字符集編碼形式保存,需要將客戶端字符集改成和輸入字符集一致的字符集。因此,如果Rails輸入的信息是UTF-8,那麼應該將Rails應用服務器的Oracle客戶端設置成 nls_lang=UTF8。
如此的話,客戶端字符集讓數據庫知道我們傳遞過去的字符是屬於哪種字符集,以便於Oracle在存儲字符時做相應的編碼映射,這樣數據就按數據庫字符集被保存了。
最後還要說的一個問題,就是nls_lang=AMERICAN_AMERICA.UTF8在哪裡進行設置。
在Windows下,可以在注冊表下以及DOS窗口裡面設置。在注冊表下設置的話,除影響Rails外,還會影響toad以及Oracle自帶的客戶端。而此時,web一切正常,Oracle自帶的客戶端查看數據也正常,但是toad的顯示還是不正常。
換成在啟動Rails前先執行 set nls_lang=AMERICAN_AMERICA.UTF8 ,這樣把影響局限在Rails應用中,注冊表中依舊采用ZHS16GBK,那麼web、toad、Oracle自帶客戶端就全都正常了。更進一步,set nls_lang=AMERICAN_AMERICA.UTF8 可以放入rails目錄下的use_ruby.cmd,這樣就會自動設置這個變量了。
綜上所述,對於Rails來說,如果選擇按UTF8來進行數據的傳遞,那麼只要存入/獲取的數據都是UTF8編碼的,在web上就能一切正常。透傳的話不影響Rails的正常工作,但保存數據的字符集就未必是數據庫的字符集了。
客戶端字符集變量的作用就是告訴數據庫傳的信息是按什麼編碼的,然後數據庫就能做相應的轉換,按數據庫自己的字符集進行存放,而在取出時也能做相應的轉換。所以說,需要將客戶端字符集改成和輸入字符集一致。