Rails3无法将“ñ”保存到Oracle 11g

时间:2013-08-06 03:22:39

标签: ruby-on-rails ruby-on-rails-3 oracle activerecord oracle11g

我正在使用Rails 3.2.13,ruby 1.9.3和Oracle 11g。使用像'ñ'这样的字符在DB中保存记录时,我收到以下错误:

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。

这些是我的Oracle宝石:

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

我该怎么办?

1 个答案:

答案 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接受您的角色并将其转换为目标字符集(通过删除重音或替换为'?')。