grails 3 oracle数据源为俄语文本

sau*_*abh 5 oracle grails cyrillic

我正在处理连接到oracle数据库的grails应用程序.它工作正常,除非数据库中有任何俄语文本.对于俄语文本,我被倒置了?在mysql的其他问题中有一些方法,但我找不到oracle的数据源配置.这里的任何帮助都会很棒.

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

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

kro*_*lko 1

以下查询的结果意味着什么?

\n\n
SELECT * FROM NLS_DATABASE_PARAMETERS \nWHERE PARAMETER LIKE \'%SET\';\nPARAMETER                      VALUE                        \n------------------------------ ------------------------------\nNLS_NCHAR_CHARACTERSET         AL16UTF16                     \nNLS_CHARACTERSET               WE8MSWIN1252        \n
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着:

\n\n
    \n
  • AL16UTF16 编码(Unicode 的 16 位编码)用于对NVARCHAR2变量、表列和文字中的数据进行编码
  • \n
  • WE8MSWIN1252(基于 8 位 ASCII 的 Oracle 数据库字符集)用于对VARCHAR2变量、表列和文字中的数据进行编码
  • \n
\n\n

不幸的是 WE8MSWIN1252 是 CP-1252 代码页,不支持俄语西里尔字符(如 \xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e \xd0\xb0\xd1\x82 等)。
\n请参阅此链接以了解此代码页支持的字符:en.wikipedia.org/wiki/Windows-1252。\n

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

\n\n
\n

俄语

\n\n

AL16UTF16、AL32UTF8、CL8ISO8859P5、CL8KOI8R、CL8MSWIN1251、RU8PC866、\n UTF8

\n
\n\n
\n\n

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

\n\n
SELECT * FROM NLS_DATABASE_PARAMETERS \nWHERE PARAMETER LIKE \'%SET\'; \nPARAMETER                      VALUE                        \n------------------------------ ------------------------------\nNLS_NCHAR_CHARACTERSET         AL16UTF16                     \nNLS_CHARACTERSET               WE8MSWIN1252 \n\n\nselect \'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' x, n\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' y from dual;\nX          Y        \n---------- ----------\n\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf \xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且:

\n\n
create table test(\n  v1 varchar2(100),\n  v2 nvarchar2(100)\n);\n\ninsert into test( v1, v2 ) values (\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\', \'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' );\ninsert into test( v1, v2 ) values (n\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\', n\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' );\n\nselect * from test;\nV1              V2            \n--------------- ---------------\n\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf      \xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf     \n\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf      \xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82 \n
Run Code Online (Sandbox Code Playgroud)\n\n

并且:

\n\n
create FUNCTION function1( par varchar2 ) return varchar2 \nIS\nBEGIN \n  return par;\nEND;\n/\ncreate FUNCTION function2( par nvarchar2 ) return varchar2 \nIS\nBEGIN \n  return par;\nEND;\n/\ncreate FUNCTION function3( par varchar2 ) return nvarchar2 \nIS\nBEGIN \n  return par;\nEND;\n/\ncreate FUNCTION function4( par nvarchar2 ) return nvarchar2 \nIS\nBEGIN \n  return par;\nEND;\n/\n\nselect function1( n\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' ) x1,\n       function2( n\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' ) x2,\n       function3( n\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' ) x3,\n       function4( n\'\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82\' ) x4\nfrom dual;\n\nX1              X2              X3              X4            \n--------------- --------------- --------------- ---------------\n\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf      \xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf      \xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf\xc2\xbf      \xd0\xba\xd0\xbe\xd0\xbd\xd1\x81\xd1\x8d\xd0\xba\xd0\xb2\xd1\x8e\xd0\xb0\xd1\x82    \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n
\n\n

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

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