Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NLS_CHARACTERSET WE8DEC и CL8MSWIN1251 / 25 сообщений из 34, страница 1 из 2
04.05.2018, 11:58
    #39639944
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
есть источник с настройками ниже:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
NLS_LANGUAGE	AMERICAN
NLS_TERRITORY	CIS
NLS_CURRENCY	?.
NLS_ISO_CURRENCY	CIS
NLS_NUMERIC_CHARACTERS	, 
NLS_CALENDAR	GREGORIAN
NLS_DATE_FORMAT	DD.MM.RR
NLS_DATE_LANGUAGE	AMERICAN
NLS_CHARACTERSET	WE8DEC
NLS_SORT	BINARY
NLS_TIME_FORMAT	HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT	DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT	DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY	?.
NLS_NCHAR_CHARACTERSET	UTF8
NLS_COMP	BINARY
NLS_LENGTH_SEMANTICS	BYTE
NLS_NCHAR_CONV_EXCP	FALSE



приёмник с настройками:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
NLS_LANGUAGE	AMERICAN
NLS_TERRITORY	CIS
NLS_CURRENCY	р.
NLS_ISO_CURRENCY	CIS
NLS_NUMERIC_CHARACTERS	, 
NLS_CALENDAR	GREGORIAN
NLS_DATE_FORMAT	DD.MM.RR
NLS_DATE_LANGUAGE	AMERICAN
NLS_CHARACTERSET	CL8MSWIN1251
NLS_SORT	BINARY
NLS_TIME_FORMAT	HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT	DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT	DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY	р.
NLS_NCHAR_CHARACTERSET	AL16UTF16
NLS_COMP	BINARY
NLS_LENGTH_SEMANTICS	BYTE
NLS_NCHAR_CONV_EXCP	FALSE



Вопрос заключается в том: как затянуть текст на кириллице из источника в приёмник, не создавая при этом на источнике объекты БД.
...
Рейтинг: 0 / 0
04.05.2018, 12:03
    #39639949
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Данный способ работает, но есть условие задачи "не создавая при этом на источнике объекты БД."
John.D AnimalЕсть одна база на UNIX-е Oracle 8.1.7.4 NLS WE8DEC (не наша),
вторая на Windows2003 Oracle 9.2.0.5 NLS CL8MSWIN1251 (наша).
К чему относиться "Наша"-"Не наша" ? Если к кодировкам - то лучше всего поменять её на юниковской базе.
Если "не наша" база - то обычный метод таков:
В базе с кривой кодировкой создаётся вьюшка, в которой все текстовые поля конвертируются в RAW
select ... UTL_RAW.cast_to_raw(text_column) raw_column ... from...
В другой базе создаётся ДБ Линк и вьюшка
select ...UTL_RAW.cast_to_varchar2(raw_column) text_column ... from ...@DBLink_name;
...
Рейтинг: 0 / 0
04.05.2018, 12:20
    #39639959
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
saxarock,

текст на приемнике ??????, или крякозябки?

.....
stax
...
Рейтинг: 0 / 0
04.05.2018, 12:23
    #39639961
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Stax,

Текст на приемнике - кириллица.
...
Рейтинг: 0 / 0
04.05.2018, 12:35
    #39639968
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
saxarockStax,

Текст на приемнике - кириллица.

в чем проблема, если "на приемнике - кириллица"?

.....
stax
...
Рейтинг: 0 / 0
04.05.2018, 12:38
    #39639970
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
saxarockесть условие задачи "не создавая при этом на источнике объекты БД."

SET NLS_LANG=.WE8DEC
Тут экспорт в плоские текстовые файлы
SET NLS_LANG=.CL8MSWIN1251
Тут импорт этих файлов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.05.2018, 13:19
    #39640007
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Задача однократная?
...
Рейтинг: 0 / 0
04.05.2018, 13:22
    #39640011
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Dimitry Sibiryakovsaxarockесть условие задачи "не создавая при этом на источнике объекты БД."

SET NLS_LANG=.WE8DEC
Тут экспорт в плоские текстовые файлы
SET NLS_LANG=.CL8MSWIN1251
Тут импорт этих файлов.


не так делается exp/imp из базы с кривой кодировкой

1) Однозначного отображения WE8 -> CL8 не существует, поэтому при любой
штатной перекодировке char/varchar2 - получите '????' вместо текста

2) Штатная перекодировка отключается когда characterset базы == characterset клиента
Поэтому, при одинаковых characterset - кодировка русского текста в we8 базе может быть любая любая русская однобайтовая. Поскольку у Вас срабатывает cast_to_raw, то скорее всего у Вас в WE8 базе хранится CL8MSWIN1251
но нужно точно определить какая именно кодировка хранится в базе

3) Второй-третий байт original import файла - код кодировки
то есть последовательность exp/imp такая:
Код: plsql
1.
2.
3.
4.
export  NLS_LANG=.WE8DEC
exp userid=/ tables="(tabname)" file=MYCL8MSWIN1251DATA 
hexedit MYCL8MSWIN1251DATA.dmp  ## fix 2-3 byte to correct characterset code
export NLS_LANG=.<any CL8 characterser>




именно поэтому для преобразования на лету использовался cast_to_raw (отключение штатной перекодировки)

Если у Вас работает указанный способ:
авторВ базе с кривой кодировкой создаётся вьюшка, в которой все текстовые поля конвертируются в RAW
Код: plsql
1.
select ... UTL_RAW.cast_to_raw(text_column) raw_column ... from...


В другой базе создаётся ДБ Линк и вьюшка
Код: plsql
1.
select ...UTL_RAW.cast_to_varchar2(raw_column) text_column ... from ...@DBLink_name;


то

Попробуйте загрузку через
Код: plsql
1.
2.
3.
4.
with src(raw_column) as (
select /*+materialize */ UTL_RAW.cast_to_raw(text_column) from tabname@dblink
)
select UTL_RAW.cast_to_varchar2(raw_column) text_column  from src
...
Рейтинг: 0 / 0
04.05.2018, 13:30
    #39640022
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Vadim Lejninне так делается exp/imp из базы с кривой кодировкой

По-моему это проще ковыряния двоичным редактором.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.05.2018, 13:49
    #39640037
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Vadim Lejnin1) Однозначного отображения WE8 -> CL8 не существует, поэтому при любой
штатной перекодировке char/varchar2 - получите '????' вместо текстаПри совпадении кодировки клиента и сервера перекодировка не осуществляется и замены на знаки вопроса не произойдет.
...
Рейтинг: 0 / 0
04.05.2018, 14:42
    #39640086
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
-2-Vadim Lejnin1) Однозначного отображения WE8 -> CL8 не существует, поэтому при любой
штатной перекодировке char/varchar2 - получите '????' вместо текстаПри совпадении кодировки клиента и сервера перекодировка не осуществляется и замены на знаки вопроса не произойдет.

Vadim Lejnin2) Штатная перекодировка отключается когда characterset базы == characterset клиента


Dimitry SibiryakovVadim Lejninне так делается exp/imp из базы с кривой кодировкой

По-моему это проще ковыряния двоичным редактором.


Суть в том, что при exp в файле будет прописана кодировка текущего сеанса
Чтобы избежать перекодировки Вам нужно будет установить WE8, которая и пропишется в dmp
И если не править файл, при imp Вы получите перекодировку WE8 -> CL8 со всеми вытекающими

Если не верите, попробуйте сделать exp/imp между базами WE8 и CL8:)
p.s.
...
Рейтинг: 0 / 0
04.05.2018, 15:01
    #39640104
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Vadim LejninПопробуйте загрузку через
Код: plsql
1.
2.
3.
4.
with src(raw_column) as (
select /*+materialize */ UTL_RAW.cast_to_raw(text_column) from tabname@dblink
)
select UTL_RAW.cast_to_varchar2(raw_column) text_column  from src



разве в UTL_RAW.cast_to_raw(text_column) текст уже не будет испорчен?

імхо
ітересно попробовать вместо/с materialize хинт DRIVING_SITE

.....
stax
...
Рейтинг: 0 / 0
04.05.2018, 15:07
    #39640113
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Вадим, начиная с 9.2 все немного сложнее
В файле экспорта данные (пользовательские) сохраняются в кодировке исходной БД, независимо от NLS_LANG (именно то, что прописано во 2-3 байтах) и, соответственно, сохраняется сама кодировка исходной БД (данные словаря перекодируются в соответствии с NLS_LANG сессии экспорта) Character Set Conversion при импорте

Если задача постоянная -- то можно попробовать создать dblink, когда серверный процесс для нашей сессии будет стартовать со своими переменными окружения, в частности NLS_LANG=.WE8DEC, т.е. например через отдельный листенер (если мы имеем дело с юниксами)
...
Рейтинг: 0 / 0
04.05.2018, 15:19
    #39640128
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
До кучи - можно решить посредством sql*plus copy command.
nls_lang выставить в .WE8DEC
Запрос к источнику - с конверсией в raw.
На приемнике - обратная конверсия любым удобным способом.

Варианты с dblink - не следует забывать, что cast_to_raw тоже надо звать "на той стороне" (cобаку "@" забыли в примере), а я бы еще и приколотил гвоздем /*+ driving_site() */
...
Рейтинг: 0 / 0
04.05.2018, 16:20
    #39640182
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Вячеслав ЛюбомудровВадим, начиная с 9.2 все немного сложнее
В файле экспорта данные (пользовательские) сохраняются в кодировке исходной БД, независимо от NLS_LANG (именно то, что прописано во 2-3 байтах) и, соответственно, сохраняется сама кодировка исходной БД (данные словаря перекодируются в соответствии с NLS_LANG сессии экспорта) Character Set Conversion при импорте

Если задача постоянная -- то можно попробовать создать dblink, когда серверный процесс для нашей сессии будет стартовать со своими переменными окружения, в частности NLS_LANG=.WE8DEC, т.е. например через отдельный листенер (если мы имеем дело с юниксами)

Вячеслав, странно, опыт показывает что это не совсем так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 $ for c in CL8MSWIN1251 WE8DEC CL8ISO8859P5 ;do env NLS_LANG=.$c exp / tables="(dropme)" file=$c.dmp log=$c.log; done 2>&1 | grep -i release
Export: Release 11.2.0.4.0 - Production on Fri May 4 16:16:58 2018
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
Export: Release 11.2.0.4.0 - Production on Fri May 4 16:16:58 2018
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
Export: Release 11.2.0.4.0 - Production on Fri May 4 16:16:58 2018
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
 $ ls -l
total 60
-rw-r--r-- 1 oracle oinstall 16384 May  4 16:16 CL8ISO8859P5.dmp
-rw-r--r-- 1 oracle oinstall   496 May  4 16:16 CL8ISO8859P5.log
-rw-r--r-- 1 oracle oinstall 16384 May  4 16:16 CL8MSWIN1251.dmp
-rw-r--r-- 1 oracle oinstall   496 May  4 16:16 CL8MSWIN1251.log
-rw-r--r-- 1 oracle oinstall 16384 May  4 16:16 WE8DEC.dmp
-rw-r--r-- 1 oracle oinstall   490 May  4 16:16 WE8DEC.log
 $ for c in CL8MSWIN1251 WE8DEC CL8ISO8859P5 ;do od --read-bytes=3 -h $c.dmp; done
0000000 0003 00ab
0000003
0000000 0003 0002
0000003
0000000 0003 0023
0000003
...
Рейтинг: 0 / 0
04.05.2018, 16:34
    #39640196
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
[quot Vadim Lejnin]Вячеслав ЛюбомудровNLS_LANG (именно то, что прописано во 2-3 байтах)Я, как всегда, коряво выражаюсь
...
Рейтинг: 0 / 0
17.10.2018, 09:46
    #39718570
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
Vadim Lejnin,

Код: plsql
1.
2.
3.
4.
with src(raw_column) as (
select /*+materialize */ UTL_RAW.cast_to_raw(text_column) from tabname@dblink
)
select UTL_RAW.cast_to_varchar2(raw_column) text_column  from src


- указанный способ не сработал(
...
Рейтинг: 0 / 0
17.10.2018, 09:50
    #39718572
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
по сути таблица перекодировок we8dec <-> cl8iso8859p5 отсутствует.


Способ рабочий

В базе с кривой кодировкой создаётся вьюшка, в которой все текстовые поля конвертируются в RAW
Код: plsql
1.
select ... UTL_RAW.cast_to_raw(text_column) raw_column ... from...


В другой базе создаётся ДБ Линк и вьюшка
Код: plsql
1.
select ...UTL_RAW.cast_to_varchar2(raw_column) text_column ... from ...@DBLink_name;




но не решает проблему т.к. на источнике создавать объекты нельзя.
...
Рейтинг: 0 / 0
17.10.2018, 10:46
    #39718608
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
saxarockуказанный способ не сработал(Про то, что функция локальная, обратил внимание stax. Соответственно, пробуй указать дблинк в вызове функции и добавить хинт driving_site.
...
Рейтинг: 0 / 0
18.10.2018, 08:17
    #39719182
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
-2-,

пробовал, конвертация все равно прошло криво.
...
Рейтинг: 0 / 0
18.10.2018, 09:45
    #39719207
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
А если utl_raw.cast_to_raw@dblink использовать?
...
Рейтинг: 0 / 0
18.10.2018, 10:16
    #39719235
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
MazoHist,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with src as 
(
SELECT 
       utl_raw.cast_to_raw@dblink(grid) grid
  FROM tbl_src@dblink c
)
select 
decode(grid,NULL,NULL,UTL_RAW.cast_to_varchar2(UTL_RAW.convert(grid,'AMERICAN_AMERICA.CL8MSWIN1251','AMERICAN_AMERICA.CL8ISO8859P5'))) grid
       from src



с хинтами тоже пробовал.
...
Рейтинг: 0 / 0
18.10.2018, 10:17
    #39719236
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
MazoHist,

результат все равно кривой
например
такой
Л?N?Y ?icOaU?O ?Oa?UU?OOc
...
Рейтинг: 0 / 0
18.10.2018, 13:44
    #39719366
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
saxarock
Код: plsql
1.
NLS_CHARACTERSET	WE8DEC


Код: plsql
1.
UTL_RAW.convert(grid,'AMERICAN_AMERICA.CL8MSWIN1251','AMERICAN_AMERICA.CL8ISO8859P5')



а почему кодировки разные?
...
Рейтинг: 0 / 0
18.10.2018, 15:18
    #39719425
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NLS_CHARACTERSET WE8DEC и CL8MSWIN1251
MazoHist,

Кодировки верные.

работает следующий способ

создаем таблицу
Код: plsql
1.
2.
3.
4.
5.
create table tmp
as
SELECT  
    utl_raw.cast_to_raw@eep(column) column
  FROM tbl_src@dblink c



потом селектом достаю нужные из нее данные
Код: plsql
1.
2.
 SELECT decode(src.column,NULL,NULL,UTL_RAW.cast_to_varchar2(UTL_RAW.convert(src.column,'AMERICAN_AMERICA.CL8MSWIN1251','AMERICAN_AMERICA.CL8ISO8859P5')))
   FROM tbl_src src


Конвертация корректная получаю нормальную кирилицу, но способ опять же кривой(
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / NLS_CHARACTERSET WE8DEC и CL8MSWIN1251 / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]