Многопоточные приложения на 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 отображались корректно ?