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

Ruby on rails Rails3无法将“ñ”保存到Oracle 11g,ruby-on-rails,ruby-on-rails-3,oracle,activerecord,oracle11g,Ruby On Rails,Ruby On Rails 3,Oracle,Activerecord,Oracle11g,我使用的是Rails 3.2.13、ruby 1.9.3和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", "STA

我使用的是Rails 3.2.13、ruby 1.9.3和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
它返回了美国

以下是我对Oracle的宝贵意见:

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

我该怎么办?

您必须区分两种不同的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会接受您的字符并将其转换为目标字符集,方法是删除重音或替换为“?”。

您必须区分两种不同的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会接受您的字符,并通过删除重音或替换为“?”将其转换为目标字符集