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:
- użytkowania
NVARCHAR2
zamiast VARCHAR2
typu danych we wszystkich tabel i procedur przechowywanych - trzeba przepisać wszystkie procedury bazy danych, funkcje, wyzwalacze itd.
- 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
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
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