oracle - 用于俄文文本的 grails 3 oracle 数据源

标签 oracle grails cyrillic

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

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

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%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 value 会导致转换为 WE8MSWIN1252 代码页,并且所有俄语字符都将丢失。

    当前情况下您可以做什么:
  • 使用 NVARCHAR2而不是 VARCHAR2所有表和存储过程中的数据类型 - 您需要重写所有数据库过程、函数、触发器等。
  • 将您的数据库迁移到另一个支持俄语的字符集。这不是一件容易的事,它超出了这个问题,有关详细信息,请参阅文档:https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011并与您的 DBA 讨论此主题
  • 关于oracle - 用于俄文文本的 grails 3 oracle 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38133455/

    相关文章:

    c# - ORA-01882 : timezone region not found in Entity Framework

    mysql - SQL查找连续的季度

    grails - 在列表中查找数据(过滤器)

    mysql - SQLJocky : Incorrect encoding of received text

    MySQL - 俄语字符显示不正确

    oracle - 如何恢复Oracle表中的数据?

    grails - 如何摆脱双重错误

    grails - Grails Calendar插件抛出堆栈/递归错误

    php - 俄语字符编码问题

    sql - 使用SQL plus应该输入什么用户名和密码