grails 3 oracle datasource для русского текста



Я работаю над приложением grails, которое подключается к базе данных oracle. Он работает нормально, за исключением тех случаев, когда в БД есть какой-либо русский текст. Для русского текста я получаю перевернутый ?. Есть некоторый подход в других вопросах для mysql, но я не смог найти конфигурацию источника данных для oracle. Любая помощь здесь будет очень кстати.



Править -
Русский текст хранится в типе данных varchar2.
а вот и запрос -



SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%Набор';
NLS_CHARACTERSET WE8MSWIN1252

NLS_NCHAR_CHARACTERSET AL16UTF16

592   1  

1 ответ:

Что означает результат нижеприведенного запроса ?

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

Это означает, что:

    Кодировка AL16UTF16 (16-битная кодировка Unicode) используется для кодирования данных в переменных NVARCHAR2, столбцах таблиц и литералах
  • WE8MSWIN1252 (8-битный набор символов базы данных Oracle на основе ASCII) используется для кодирования данных в переменных VARCHAR2, столбцах таблиц и литералах

К сожалению, WE8MSWIN1252 - это кодовая страница CP-1252, которая не поддерживает русские кириллические символы (например, консэквюат и т. д.).
Смотрите эту ссылку, чтобы узнать поддерживаемые символы на этой кодовой странице: en.wikipedia.org/wiki/Windows-1252 .

Кто-то во время установки не учел русские символы и, вероятно, выбрал плохую кодовую страницу. В документации перечислены кодовые страницы, поддерживающие русский язык (см. таблицу A-13 языки и наборы символов, поддерживаемые LCSSCAN и ГДК):
https://docs.oracle.com/database/121/NLSPG/applocaledata.htm#NLSPG585

Русский

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 приводит к преобразованию в кодовую страницу WE8MSWIN1252, и все русские символы теряются.


Что вы можете сделать в текущей ситуации:

  1. используйте NVARCHAR2 вместо VARCHAR2 тип данных во всех таблицах и хранимых процедурах - вам нужно переписать все процедуры базы данных, функции, триггеры и т. д.
  2. перенесите базу данных на другой набор символов, поддерживающий русский язык. Это непростая задача, и она выходит за рамки этого вопроса, ибо подробности смотрите в документации: https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011 и обсудите эту тему с вашим DBA

Comments

    Ничего не найдено.