Как правильно вставить некоторые специальные символы, например товарный знак, в базу данных Oracle

У меня есть база данных Oracle. Мне нужно выполнить несколько сценариев вставки, которые заполняют столбец nvarchar2. Операторы вставки включают некоторые специальные символы, такие как «(левая кавычка)» (правая кавычка), ™ (знак торговой марки).

create table myTable ( column1 number, column2 nvarchar2(50) );
insert into myTable (column1, column2) values(1, 'Lorem Ipsum™ Sed “dolor sit amet”');

Я запускаю запрос в редакторе SQLDeveloper. Но специальные символы заменяются вопросительными знаками, как показано ниже:

select * from myTable;

Column1     Column2
------      ------------------------------
1           Lorem Ipsum? Sed ?dolor sit amet?

Но когда я добавляю новую строку в таблицу с графическим интерфейсом SQLDeveloper, это прекрасно как это изображение

Параметры NLS базы данных находятся здесь:

SELECT * FROM NLS_DATABASE_PARAMETERS where PARAMETER in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

PARAMETER               VALUE
------------            ------------
NLS_CHARACTERSET        WE8ISO8859P9
NLS_NCHAR_CHARACTERSET  AL16UTF16

Что мне делать, чтобы правильно вставить упомянутые выше символы?


person yesref    schedule 29.05.2017    source источник
comment
Какое значение установлено для переменной среды NLS_LANG в ОС, в которой выполняется первая вставка?   -  person sandman    schedule 29.05.2017
comment
@sandman Оба запроса вставки выполняются в одной ОС (Windows 10) и на одном компьютере. Я не видел ни одной переменной окружения с именем NLS_LANG   -  person yesref    schedule 29.05.2017
comment
попробуйте установить NLS_LANG на AMERICAN_AMERICA.WE8ISO8859P9   -  person sandman    schedule 29.05.2017
comment
Установка переменной NLS_LANG проблему не решила. Вопросительные знаки все еще существуют   -  person yesref    schedule 29.05.2017
comment
Разве вы не пробовали insert into myTable (column1, column2) values(1, N'Lorem Ipsum™ Sed “dolor sit amet”');?   -  person krokodilko    schedule 29.05.2017
comment
Да, пробовал. Это не решило.   -  person yesref    schedule 30.05.2017
comment
Пробовали новые вставки после установки NLS_LANG? Старые символы не сохранились бы правильно   -  person sandman    schedule 30.05.2017
comment
@sandman Да, пробовал. На моей машине это не сработало. Но случилось кое-что интересное. ОС сервера баз данных Oracle - CentOS. Я установил NLS_LANG на сервере на AMERICAN_AMERICA.WE8ISO8859P9. А когда вставлял новую строку из SQL Plus на сервер, он аккуратно вставлял символ торговой марки. Но когда я выбираю эту строку из SQL Developer в Windows, вместо товарного знака отображаются вопросительные знаки.   -  person yesref    schedule 30.05.2017
comment
да, это довольно раздражает ... иногда у вас есть приложения, которые отлично работают с набором символов, поскольку он запрограммирован на чтение NLS_LANG или использует API, который знает. В других приложениях вам нужно зайти в меню и установить кодировку. SQL * plus в Windows и ваша ОС должны быть в порядке, но пользовательские приложения для Windows, такие как plsqldeveloper, запрограммированы по-другому.   -  person sandman    schedule 30.05.2017


Ответы (1)


Используйте UNISTR для символов Unicode, которые могут не работать в разных средах:

create table myTable ( column1 number, column2 nvarchar2(50) );

insert into myTable (column1, column2)
values(1, 'Lorem Ipsum' || unistr('\2122') || ' Sed ' ||
    unistr('\201C') || 'dolor sit amet' || unistr('\201D'));
person Jon Heller    schedule 30.05.2017
comment
Спасибо, работает по одному запросу. Но я не запускаю только один скрипт вставки. Тысячи запросов на вставку автоматически генерируются сторонним приложением. Кроме того, у меня есть приложение Java, из которого поступают некоторые запросы на вставку. Так что если я не ошибаюсь, мы можем решить проблему с кодировкой - person yesref; 30.05.2017