2016-06-30 13 views
5

Sto lavorando a un'applicazione Grails che si collega al database di Oracle. Funziona bene tranne quando ci sono dei testi russi nel db. Per il testo russo, sono invertito? Ci sono alcuni approcci in altre domande per mysql ma non sono riuscito a trovare la configurazione dell'origine dati per Oracle. Qualsiasi aiuto qui sarà grande.grails 3 oracle datasource per il testo russo

MODIFICA - Il testo russo è memorizzato nel tipo di dati varchar2. e questa è la query -

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

+1

Eseguire questa query: 'SELECT * FROM WHERE NLS_DATABASE_PARAMETERS parametro LIKE '% SET'' e aggiungi il risultato alla domanda ** come testo, non come una bitmap **. Spiega anche quale tipo di dati è usato nelle tue tabelle per memorizzare un testo russo, è VARCHAR2 o NVARCHAR2 o CLOB o NCLOB? Attualmente ci sono poche informazioni nella domanda per diagnosticare questo problema. – krokodilko

+0

WE8MSWIN1252 è la tabella codici CP-1252, non supporta i caratteri cirillici russi (come 'консэквюат' ecc.), Vedere questo collegamento per conoscere i caratteri supportati da questa tabella codici: https://en.wikipedia.org/wiki/Windows- 1252. È necessario utilizzare 'NVARCHAR2' anziché il tipo di dati' VARCHAR2' per archiviare un testo di questo tipo, o migrare (convertire) il database in una codepage corretta (ma non è una tak facile). – krokodilko

risposta

1

Che cosa fa un risultato della query di sotto significa?

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

Questo significa che:

  • codifica AL16UTF16 (a 16 bit codifica Unicode) è usato per codificare i dati in NVARCHAR2 variabili, colonne di tabelle e letterali
  • WE8MSWIN1252 (a 8 bit Set di caratteri Oracle Database basato su ASCII) per codificare i dati nelle variabili VARCHAR2, colonne di tabella e valori letterali

Sfortunatamente WE8M SWIN1252 è la tabella codici CP-1252, che non supporta i caratteri cirillici russi (come консэквюат ecc.).
Vedere questo collegamento per conoscere i caratteri supportati da questa tabella codici: en.wikipedia.org/wiki/Windows-1252.

Qualcuno durante l'installazione non ha considerato i caratteri russi e probabilmente ha scelto una pagina di codice errata. Le pagine di codice liste di documentazione che supportano la lingua russa (vedi tabella A-13 Lingue e set di caratteri supportati da LCSSCAN e GDK):
https://docs.oracle.com/database/121/NLSPG/applocaledata.htm#NLSPG585

russo

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


È possibile osservare un effetto di utilizzare la pagina di codice nei seguenti esempi:

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   
---------- ---------- 
¿¿¿¿¿¿¿¿¿¿ консэквюат 

e anche:

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    
--------------- --------------- 
¿¿¿¿¿¿¿¿¿¿  ¿¿¿¿¿¿¿¿¿¿  
¿¿¿¿¿¿¿¿¿¿  консэквюат 

e anche:

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    
--------------- --------------- --------------- --------------- 
¿¿¿¿¿¿¿¿¿¿  ¿¿¿¿¿¿¿¿¿¿  ¿¿¿¿¿¿¿¿¿¿  консэквюат  

Come si può vedere dagli esempi precedenti, solo NVARCHAR2 valori vengono adeguatamente conservati e convertiti, qualsiasi utilizzo di Il valore VARCHAR2 causa una conversione nella code page WE8MSWIN1252 e tutti i caratteri russi vengono persi.


Cosa si può fare nella situazione attuale:

  1. Uso NVARCHAR2 invece di VARCHAR2 tipo di dati in tutte le tabelle e le stored procedure - è necessario riscrivere tutte le procedure di database, funzioni, trigger, ecc
  2. Migrare il database in un altro set di caratteri che supporta la lingua russa. Questo non è un compito facile ed è beyound questa domanda, per i dettagli consultare la documentazione: https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011 e disscuss questo argomento con il vostro DBA
Problemi correlati