1

我使用的是Rails 3.2.13,ruby 1.9.3和Oracle 11g。當保存在一個數據庫中的記錄與像字符「N」我得到的錯誤如下:Rails3無法將'ñ'保存到Oracle 11g

ActiveRecord::StatementInvalid (Encoding::UndefinedConversionError: 
U+00F1 from UTF-8 to US-ASCII: INSERT INTO "OMNIAUTH_USERS" ("CREATED_AT", 
"FIRST_NAME", "ID", "LAST_NAME", "STATUS", "UID", "UPDATED_AT") VALUES (:a1, 
:a2, :a3, :a4, :a5, :a6, :a7)): 
app/controllers/user_sessions_controller.rb:18:in `create' 

我試圖運行此查詢,看看Oracle使用的語言:

SELECT USERENV ('language') FROM DUAL 

它退回AMERICAN_AMERICA.AL32UTF8。

這些都是我的寶石甲骨文:

gem 'ruby-oci8', '~> 2.1.5' 
gem 'activerecord-oracle_enhanced-adapter', '~> 1.4.2' 
gem 'ruby-plsql', '~> 0.5.0' 

我該怎麼辦?

回答

1

你必須區分兩種不同的NLS設置

  • 外部一個 - 在你的應用程序環境變量NLS_LANG定義。當您將數據發送到OCI客戶端庫時,這決定了您的內部字符串表示。

  • 內部一個。這是Oracle用來將數據存儲在磁盤上的字符集。

嘗試執行

select r.module, t.* 
from v$sesssion_connection_info t 
join v$session r on (r.sid = t.sid and t.serial# = r.serial#) 
where r.sid = <your ruby connection SID>; 

select * from nls_database_parameters; 
select * from nls_instance_parameters; 

如果它表明,你正在使用類似US7ASCII或ISO8859P1那麼Oracle接受你的性格,並把它轉換成目標字符集(通過消除口音或用'?'取代)。