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