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:
- 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
- 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
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
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