2016-06-30 13 views
5

Pracuję nad aplikacją grails, która łączy się z bazą danych oracle. Działa dobrze, z wyjątkiem sytuacji, gdy w bazie danych jest dowolny tekst w języku rosyjskim. W przypadku tekstu rosyjskiego otrzymuję odwrócony? W innych pytaniach dla mysql jest pewne podejście, ale nie mogłem znaleźć konfiguracji źródła danych dla Oracle. Każda pomoc tutaj będzie świetna.grails 3 źródło danych oracle dla tekstu rosyjskiego

EDYCJA - Tekst rosyjski jest przechowywany w typie danych varchar2. i tutaj jest zapytanie -

SELECT * FROM NLS_DATABASE_PARAMETERS GDZIE PARAMETR LIKE "% SET"; NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16

+1

Proszę uruchomić tę kwerendę: 'select * from NLS_DATABASE_PARAMETERS GDZIE parametru, jak i„% SET'' dołącz wynik do pytania ** jako tekstu, a nie do bitmapy **. Proszę również wyjaśnić, który typ danych jest używany w twoich tabelach do przechowywania rosyjskiego tekstu, czy jest to VARCHAR2 lub NVARCHAR2 lub CLOB lub NCLOB? Obecnie w pytaniu jest niewiele informacji na temat diagnozy tego problemu. – krokodilko

+0

WE8MSWIN1252 to strona kodowa CP-1252, nie obsługuje rosyjskich znaków cyrylicy (np. 'Консэквюат' itp), zobacz ten link, aby poznać obsługiwane znaki na tej stronie kodowej: https://en.wikipedia.org/wiki/Windows- 1252. Musisz użyć typu "NVARCHAR2" zamiast typu "VARCHAR2", aby zapisać taki tekst, lub zmigrować (przekonwertować) bazę danych na prawidłową stronę kodową (ale nie jest to łatwe zadanie). – krokodilko

Odpowiedz

1

Co wynika z poniższej zapytania oznacza?

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

oznacza to, że:

  • kodowania AL16UTF16 (kodujący 16-bitowy Unicode) jest używany do kodowania danych NVARCHAR2 zmiennych kolumn tabeli i literałach
  • WE8MSWIN1252 (8-bitowych Oparty na ASCII zestaw znaków bazy danych Oracle) służy do kodowania danych w zmiennych VARCHAR2, kolumnach tabeli i literałach

Niestety WE8M SWIN1252 to strona kodowa CP-1252, która nie obsługuje rosyjskich znaków cyrylicy (takich jak консэквюат itp.).
Zobacz ten link, aby poznać obsługiwane znaki na tej stronie kodowej: en.wikipedia.org/wiki/Windows-1252.
Ktoś podczas instalacji nie uznał rosyjskich znaków i prawdopodobnie wybrał złą stronę kodową. Strony kodowe wykazy dokumentacji, które obsługują języka rosyjskiego (patrz tabela A-13 języki i zestawy znaków Obsługiwane przez LCSSCAN i GDK):
https://docs.oracle.com/database/121/NLSPG/applocaledata.htm#NLSPG585

rosyjski

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


można zaobserwować efekt korzystania z tej strony kodowej w poniższych przykładach:

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

a także:

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

a także:

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

Jak widać z powyższych przykładów, tylko NVARCHAR2 wartości są odpowiednio przechowywane i przekształcane, każde użycie Wartość VARCHAR2 powoduje konwersję na stronę kodową WE8MSWIN1252, a wszystkie znaki rosyjskie są tracone.


Co można zrobić w obecnej sytuacji:

  1. użytkowania NVARCHAR2 zamiast VARCHAR2 typu danych we wszystkich tabel i procedur przechowywanych - trzeba przepisać wszystkie procedury bazy danych, funkcje, wyzwalacze itd.
  2. Migracja bazy danych do innego zestawu znaków, który obsługuje język rosyjski. Nie jest to łatwe zadanie i to beyound to pytanie, więcej szczegółów znajduje się w dokumentacji: https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011 i resztą porozmawiac ten temat ze swoim DBA
Powiązane problemy