grails 3 oracle datasource для русского текста
Я работаю над приложением grails, которое подключается к базе данных oracle. Он работает нормально, за исключением тех случаев, когда в БД есть какой-либо русский текст. Для русского текста я получаю перевернутый ?. Есть некоторый подход в других вопросах для mysql, но я не смог найти конфигурацию источника данных для oracle. Любая помощь здесь будет очень кстати.
Править -
Русский текст хранится в типе данных varchar2.
а вот и запрос -
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%Набор';
NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16
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, и все русские символы теряются.
Что вы можете сделать в текущей ситуации:
- используйте
NVARCHAR2вместоVARCHAR2тип данных во всех таблицах и хранимых процедурах - вам нужно переписать все процедуры базы данных, функции, триггеры и т. д.- перенесите базу данных на другой набор символов, поддерживающий русский язык. Это непростая задача, и она выходит за рамки этого вопроса, ибо подробности смотрите в документации: https://docs.oracle.com/database/121/NLSPG/ch11charsetmig.htm#NLSPG011 и обсудите эту тему с вашим DBA
Comments