grails 3 oracle 俄语文本数据源
grails 3 oracle datasource for russian text
我正在开发一个连接到 oracle 数据库的 grails 应用程序。它工作正常,除非数据库中有任何俄语文本。对于俄语文本,我倒置了?。 mysql 的其他问题中有一些方法,但我找不到 oracle 的数据源配置。这里的任何帮助都会很棒。
编辑 -
俄语文本存储在 varchar2 数据类型中。
这是查询 -
SELECT * 来自 NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%SET';
NLS_CHARACTERSETWE8MSWIN1252
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
变量、table 列和文字 中的数据进行编码
- WE8MSWIN1252(基于 8 位 ASCII 的 Oracle 数据库字符集)用于对
VARCHAR2
变量、table 列和文字 中的数据进行编码
不幸的是,WE8MSWIN1252 是 CP-1252 代码页,不支持俄语西里尔字符(如 консэквюат 等)。
请参阅此 link 以了解此代码页支持的字符:en.wikipedia.org/wiki/Windows-1252。
安装期间有人没有考虑俄语字符,可能选择了错误的代码页。该文档列出了支持俄语的代码页(请参阅 Table 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 代码页并且所有俄语字符都将丢失。
在当前情况下你能做什么:
- 在所有 table 和存储过程中使用
NVARCHAR2
而不是 VARCHAR2
数据类型 - 您需要重写所有数据库过程、函数、触发器等
- 将您的数据库迁移到另一个支持俄语的字符集。这不是一件容易的事,它超出了这个问题,有关详细信息,请参阅文档:https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011 并与您的 DBA 讨论此主题
我正在开发一个连接到 oracle 数据库的 grails 应用程序。它工作正常,除非数据库中有任何俄语文本。对于俄语文本,我倒置了?。 mysql 的其他问题中有一些方法,但我找不到 oracle 的数据源配置。这里的任何帮助都会很棒。
编辑 - 俄语文本存储在 varchar2 数据类型中。 这是查询 -
SELECT * 来自 NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%SET';
NLS_CHARACTERSETWE8MSWIN1252
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
变量、table 列和文字 中的数据进行编码
- WE8MSWIN1252(基于 8 位 ASCII 的 Oracle 数据库字符集)用于对
VARCHAR2
变量、table 列和文字 中的数据进行编码
不幸的是,WE8MSWIN1252 是 CP-1252 代码页,不支持俄语西里尔字符(如 консэквюат 等)。
请参阅此 link 以了解此代码页支持的字符:en.wikipedia.org/wiki/Windows-1252。
安装期间有人没有考虑俄语字符,可能选择了错误的代码页。该文档列出了支持俄语的代码页(请参阅 Table 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 代码页并且所有俄语字符都将丢失。
在当前情况下你能做什么:
- 在所有 table 和存储过程中使用
NVARCHAR2
而不是VARCHAR2
数据类型 - 您需要重写所有数据库过程、函数、触发器等 - 将您的数据库迁移到另一个支持俄语的字符集。这不是一件容易的事,它超出了这个问题,有关详细信息,请参阅文档:https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011 并与您的 DBA 讨论此主题