Windows 1251 to utf 8 oracle

Многопоточные приложения на C++

bytestream 14.05.2025

C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .

Stack, Queue и Hashtable в C#

UnmanagedCoder 14.05.2025

Каждый опытный разработчик наверняка сталкивался с ситуацией, когда невинный на первый взгляд List<T> превращался в узкое горлышко всего приложения. Причина проста: универсальность – это прекрасно,. . .

Как использовать OAuth2 со Spring Security в Java

Javaican 14.05.2025

Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . .

Анализ текста на Python с NLTK и Spacy

AI_Generated 14.05.2025

NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . .

Реализация DI в PHP

Jason-Webb 13.05.2025

Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .

Обработка изображений в реальном времени на C# с OpenCV

stackOverflow 13.05.2025

Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .

POCO, ACE, Loki и другие продвинутые C++ библиотеки

NullReferenced 13.05.2025

В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .

Паттерны проектирования GoF на C#

UnmanagedCoder 13.05.2025

Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .

Создаем CLI приложение на Python с Prompt Toolkit

py-thonny 13.05.2025

Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .

Конвейеры ETL с Apache Airflow и Python

AI_Generated 13.05.2025

ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .

Отображение текста, сохранённого в разных кодировках в бд с однобайтной кодировкой, через db link из UTF бд

Непрямой способ для редких случаев когда нужно одновременно получить / отобразить данные, сохранённые в разных однобайтовых кодировках

Вставка в бд с однобайтной кодировкой:

$ export LANG=russian
$ export NLS_LANG=AMERICAN_CIS.CL8MSWIN1251
$ sqlplus scott/tiger

SQL> select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET               CL8MSWIN1251                             -- однобайтовая бд
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_RDBMS_VERSION              11.2.0.3.0

SQL> create table nls_test(lang char(2), text varchar2(100));

Table created.

SQL> insert into nls_test values('RU', 'Текст на русском языке');

1 row created.

SQL> insert into nls_test values('IW', 'םוןםי OIJOI םןחארגארארג');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from nls_test;                                     -- в кириллической кодировке на клиенте 1251

LAN TEXT
--- ----------------------------------------------------------------------------------------------------
RU  Текст на русском языке                                       -- 1251 отображается правильно
IW  непнй OIJOI нпзашвашашв                                      -- 1255 отображается кириллицей

SQL> select * from nls_test;                                     -- в иностранной кодировке 1255

LAN TEXT
--- ----------------------------------------------------------------------------------------------------
RU  ׂוךסע םא נףססךמל �ח�ךו                                       --  всё отображается некириллическими символами
IW  םוןםי OIJOI םןחארגארארג

Преобразование символов в UTF8 коды в бд с однобайтовой кодировкой, как я понимаю, затруднительна:

SQL> select convert(text, 'CL8MSWIN1251', 'AL32UTF8') FROM scott.nls_test;
select convert(text, 'CL8MSWIN1251', 'AL32UTF8') FROM scott.nls_test
                                                            *
ERROR at line 1:
ORA-12703: this character set conversion is not supported

На соседней бд с UTF кодировкой, естественно, при использовании UTF шрифтов на клиенте (putty Translation -> UTF):

$ set | grep 'LANG\='
LANG=en_US.UTF-8
NLS_LANG=AMERICAN_CIS.UTF8

SQL> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

VALUE
-----
UTF8

SQL> create database link scott_db1251 connect to scott IDENTIFIED BY tiger using 'db1251';

Database link created.

SQL> select
       decode( lang, 'IW ', UTL_I18N.raw_to_char(UTL_I18N.STRING_TO_RAW(text, 'CL8MSWIN1251'), 'IW8MSWIN1255')
  3                , 'RU ', UTL_I18N.raw_to_char(UTL_I18N.STRING_TO_RAW(text, 'CL8MSWIN1251'), 'CL8MSWIN1251')
  4                , 'Unknown language') as "Text"
  5  FROM nls_test@scott_db1251;

Text
------------------------------------------------------------
Текст на русском языке
                                     םוןםי OIJOI םןחארגארארג

Метод, мягко говоря, непрямой, но работает на встроенных технологиях Oracle — промежуточная UTF бд играет роль «перекодирующего клиента»

Вопрос: есть ли более простой способ?

Комментарии к записи Отображение текста, сохранённого в разных кодировках в бд с однобайтной кодировкой, через db link из UTF бд отключены

Пример, как определить кодировку строки UTF8 или WIN1251?

with t as
(select 'Текст в кодировке UTF8' filename from dual union
select 'Текст в кодировке WIN1251' filename from dual union
select 'Text does not contain cyrilic charcters' filename from dual)
select filename,
case
    when not regexp_like(asciistr(convert(filename, 'cl8mswin1251')), '\FFFD') then
        case
            when regexp_like(convert(filename, 'cl8mswin1251', 'utf8'),'[а-яА-Я]') then 'UTF8'
            else 'WIN1251'
        end
        else 'WIN1251'
end ENCODE from t
order by 2;

FILENAME                                  ENCODE
----------------------------------------- -------
Текст РІ РєРѕРґРёСЂРѕРІРєРµ UTF8     UTF8   
Текст в кодировке WIN1251                 WIN1251
Text does not contain cyrilic charcters   WIN1251

Теперь дополним пример конвертацией текста UTF8 в WIN1251:

with t as
(select 'Текст в кодировке UTF8' filename from dual union
select 'Текст в кодировке WIN1251' from dual union
select 'Text does not contain cyrilic charcters' from dual)
select
encode,
case
    when ENCODE = 'WIN1251' then filename
    else convert(filename, 'cl8mswin1251', 'utf8')
end decode_filename
from(
select filename,
case
    when not regexp_like(asciistr(convert(filename, 'cl8mswin1251')), '\FFFD') then
        case
            when regexp_like(convert(filename, 'cl8mswin1251', 'utf8'),'[а-яА-Я]') then 'UTF8'
            else 'WIN1251'
        end
        else 'WIN1251'
end ENCODE from t)
order by 2;
                                      
ENCODE    DECODE_FILENAME
--------  -----------------------------------------
UTF8      Текст в кодировке UTF8
WIN1251   Текст в кодировке WIN1251
WIN1251   Text does not contain cyrilic charcters                                                      

Skip to content

The Oracle CONVERT() function converts a string from one character set to another.

Note that the CONVERT() function is often used to correct data stored in the database with a wrong character set.

Syntax #

The following shows the syntax of the Oracle CONVERT() function:

CONVERT(string_expression,to_data_set[,from_data_set]);Code language: SQL (Structured Query Language) (sql)

Arguments #

The Oracle CONVERT() function accepts three arguments:

1) string_expression

is the string whose character set should be converted.

2) to_data_set

is the name of the character set to which the string_expression is converted to:

3) from_data_set

is the name of the character set that is used to store the string_expression in the database. This argument is optional and its default value is the database character set.

Return value #

The CONVERT() function returns a string in the converted character set.

Examples #

The following example converts a string from ANSI to UTF8:

SELECT
  CONVERT( 'ABC', 'utf8', 'us7ascii' )
FROM
  dual;
Code language: SQL (Structured Query Language) (sql)

Here is the result:

'ABC'Code language: SQL (Structured Query Language) (sql)

The following statement illustrates how to convert the character set of a string from Latin-1 to ASCII.

SELECT
  CONVERT( 'Ä Ê Í', 'US7ASCII', 'WE8ISO8859P1' )
FROM
  DUAL;Code language: SQL (Structured Query Language) (sql)

The result is:

'A E I'
Code language: SQL (Structured Query Language) (sql)

Note that the result is the same as converting the string from the WE8ISO8859P1 character set to the US7ASCII character set.

The following table shows the common character sets:

Character Set Description
AL32UTF8 Unicode 5.0 Universal character set UTF-8 encoding form
EE8MSWIN1250 Microsoft Windows East European Code Page 1250
JA16SJISTILDE Japanese Shift-JIS Character Set, compatible with MS Code Page 932
US7ASCII US 7-bit ASCII character set
UTF8 Unicode 3.0 Universal character set CESU-8 encoding form
WE8EBCDIC1047 IBM West European EBCDIC Code Page 1047
WE8ISO8859P1 ISO 8859-1 West European 8-bit character set
WE8MSWIN1252 Microsoft Windows West European Code Page 1252
ZHT16MSWIN950 Microsoft Windows Traditional Chinese Code Page 950

To get all the valid character sets, you query them from the V$NLS_VALID_VALUES view as follows:

SELECT
  value
FROM
  V$NLS_VALID_VALUES
WHERE
  parameter = 'CHARACTERSET' AND ISDEPRECATED = 'FALSE'
ORDER BY
  value;Code language: SQL (Structured Query Language) (sql)

Summary #

  • Use the Oracle CONVERT() function to convert a string from a character set to another.

Was this tutorial helpful?

В локальной сети предприятия есть два сервера. На первом сервере установлен Red Hat Enterprise Linux AS release 3 (Taroon Update 5). Кроме того на первом сервере установлен Oracle9i Enterprise Edition Release 9.2.0.7.0 — 64bit Production (в дальнейшем по тексту я буду называть этот сервер источником данных). В локалях сервера кодировка UTF-8.

Используйте данную ссылку, что бы развернуть или свернуть блок текста

Результат выполнения команды locale на сервере источнике данных:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

Кодировка в Oracle CL8MSWIN1251

Используйте данную ссылку, что бы развернуть или свернуть блок текста

Результат выполнения запроса (SELECT * FROM NLS_DATABASE_PARAMETERS;) по выборке кодировки в Oracle:

NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET CL8MSWIN1251

На втором сервере (в дальнейшем по тексту сервер приемник данных) установлена операционная система CentOS Linux release 6.0 (Final). В качестве СУБД установлен PostgreSQL 8.4.4. В локалях сервера кодировка UTF-8.

Используйте данную ссылку, что бы развернуть или свернуть блок текста

Результат выполнения команды locale на сервере приемнике данных:

LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

В качестве кодировки в БД в postgreSQL выбрана ru_RU.UTF-8.

Используйте данную ссылку, что бы развернуть или свернуть блок текста

Данные из окна просмотра сведений о БД в web-интерфейсе:

База данных Пользователь Кодировка Collation Character Type
CAT postgres UTF8 ru_RU.UTF-8 ru_RU.UTF-8

Между БД приемником и БД исочником организована связь при помощи unixODBC 2.2.14.

Используйте данную ссылку, что бы развернуть или свернуть блок текста

Файл настройки unixODBC /etc/odbc.ini:

[M3ATI]  
Description  = Oracle ODBC  
Driver   = M3ATI  
Trace   = yes  
TraceFile  = /tmp/odbc_oracle.log  
ServerName  = //<IP-адрес сервера источника>:<Порт>/<Имя БД>
DATABASE = <Имя БД>
UserID   = <Имя пользователя> 
Password  = <Пароль>
Port   = <Порт>

Файл настройки unixODBC /etc//etc/odbcinst.ini :

[M3ATI] 
Description = Oracle ODBC Connection Driver  
Driver  = /usr/lib64/libsqora.so.10.1  
Driver64  = /usr/lib64/libsqora.so.10.1  
Debug  = 0  
CommLog  = 1 

Делаю выборку данных при помощи следующих SQL-команд:

SELECT odbclink.connect('DSN=M3ATI');
SELECT * FROM odbclink.query(1,'SELECT id,name,description from repl_db.links') AS t (id numeric,name text,description text);

в результате выполнения sql русские символы в полях БД источника заменяются на символ знак вопроса («????»). Попытке выборки проводились как из программы администрирования БД (PgAdmin III 1.14.0) так и из утилиты psql.

Используйте данную ссылку, что бы развернуть или свернуть блок текста

Результат выполнения запроса по выборке данных из БД источника:

id numeric name text description text
2 POL ??? ?????? ??????????? ????????? ???????????

Что необходимо сделать, чтобы русские символы при выборке по ODBC-Link отображались корректно ?

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Значки mac os для windows
  • Как установить драйвер xerox phaser 3100 mfp для windows 10
  • Как переустановить windows не форматируя диск d
  • К системным программам относятся bios ms windows ms word paint linux драйверы антивирусы ответы
  • Обновление windows 10 до windows 11 бесплатно или нет