1

我正在使用 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

它返回 AMERICAN_AMERICA.AL32UTF8。

这些是我对 Oracle 的珍宝:

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

我应该怎么办?

4

1 回答 1

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

于 2013-08-06T13:02:36.150 回答