加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

grails 3 oracle数据源为俄语文本

发布时间:2020-12-12 13:15:00 所属栏目:百科 来源:网络整理
导读:我正在处理连接到oracle数据库的grails应用程序.它工作正常,除非数据库中有任何俄语文本.对于俄语文本,我被倒置了?在 mysql的其他问题中有一些方法,但我找不到oracle的数据源配置.这里的任何帮助都会很棒. 编辑 – 俄语文本存储在varchar2数据类型中. 这是
我正在处理连接到oracle数据库的grails应用程序.它工作正常,除非数据库中有任何俄语文本.对于俄语文本,我被倒置了?在 mysql的其他问题中有一些方法,但我找不到oracle的数据源配置.这里的任何帮助都会很棒.

编辑 –
俄语文本存储在varchar2数据类型中.
这是查询 –

SELECT * FROM NLS_DATABASE_PARAMETERS参数类似于’%SET’;
NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16

解决方法

以下查询的结果是什么意思?

SELECT * FROM NLS_DATABASE_PARAMETERS 
WHERE PARAMETER LIKE '%SET';
PARAMETER                      VALUE                        
------------------------------ ------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16                     
NLS_CHARACTERSET               WE8MSWIN1252

这意味着:

> AL16UTF16编码(Unicode的16位编码)用于编码NVARCHAR2变量,表格列和文字中的数据
> WE8MSWIN1252(基于8位ASCII的Oracle数据库字符集)用于编码VARCHAR2变量,表格列和文字中的数据

不幸的是,WE8MSWIN1252是CP-1252代码页,它不支持俄语西里尔字符(如консэквюат等).
请参阅此链接以了解此代码页支持的字符:en.wikipedia.org/wiki/Windows-1252.

安装过程中有人没有考虑俄语字符,可能选择了错误的代码页.该文档列出了支持俄语的代码页(参见表A-13 LCSSCAN和GDK支持的语言和字符集):
https://docs.oracle.com/database/121/NLSPG/applocaledata.htm#NLSPG585

Russian

AL16UTF16,AL32UTF8,CL8ISO8859P5,CL8KOI8R,CL8MSWIN1251,RU8PC866,
UTF8

您可以在以下示例中观察使用此代码页的效果:

SELECT * FROM NLS_DATABASE_PARAMETERS 
WHERE PARAMETER LIKE '%SET'; 
PARAMETER                      VALUE                        
------------------------------ ------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16                     
NLS_CHARACTERSET               WE8MSWIN1252 


select 'консэквюат' x,n'консэквюат' y from dual;
X          Y        
---------- ----------
?????????? консэквюат

并且:

create table test(
  v1 varchar2(100),v2 nvarchar2(100)
);

insert into test( v1,v2 ) values ('консэквюат','консэквюат' );
insert into test( v1,v2 ) values (n'консэквюат',n'консэквюат' );

select * from test;
V1              V2            
--------------- ---------------
??????????      ??????????     
??????????      консэквюат

并且:

create FUNCTION function1( par varchar2 ) return varchar2 
IS
BEGIN 
  return par;
END;
/
create FUNCTION function2( par nvarchar2 ) return varchar2 
IS
BEGIN 
  return par;
END;
/
create FUNCTION function3( par varchar2 ) return nvarchar2 
IS
BEGIN 
  return par;
END;
/
create FUNCTION function4( par nvarchar2 ) return nvarchar2 
IS
BEGIN 
  return par;
END;
/

select function1( n'консэквюат' ) x1,function2( n'консэквюат' ) x2,function3( n'консэквюат' ) x3,function4( n'консэквюат' ) x4
from dual;

X1              X2              X3              X4            
--------------- --------------- --------------- ---------------
??????????      ??????????      ??????????      консэквюат

从上面的示例中可以看出,只有NVARCHAR2值被正确存储和转换,任何VARCHAR2值的使用都会导致转换为WE8MSWIN1252代码页,并且所有俄语字符都将丢失.

在目前的情况下你可以做些什么:

>在所有表和存储过程中使用NVARCHAR2而不是VARCHAR2数据类型 – 您需要重写所有数据库过程,函数,触发器等.
>将数据库迁移到支持俄语的另一个字符集.这不是一件容易的事,而且这个问题很突出,有关详细信息,请参阅文档:https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011并与您的DBA讨论此主题

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读