Вопрос для специалистов Oracle
2910
3
У меня есть следующий вопрос к специалистам Oracle.
Согласно рекомендациям Oracle для баз данных межнационального использования, в наших аппликациях мы переводим типы данных с VARCHAR2 на NVARCHAR2 и CHAR на NCHAR, чтобы успешно работать с unicode базами данных, которые имеют database character set равный AL32UTF8 и national character set равный AL16UTF16, с различных клиент-компьютеров, имеющих различные региональные установки (например NLS_LANG=GERMAN_GERMANY.WE8MSWIN1252, NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251, NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 и т.п. с соответствующими значениями параметров Regional and Language Options в Windows операционных системах клиент-компьютеров.
Oказалось, что использование таких типов данных сопряжено с определенными проблемами. Одну из которых я продемонстрирую на примере ниже:
SQL> create table t1 (c1 nvarchar2(50));
Tabelle wurde erstellt.
SQL> insert into t1 values('2');
1 Zeile wurde erstellt.
SQL> select c1 from t1
2 union
3 select '1' as c1 from t1;
select c1 from t1
*
FEHLER in Zeile 1:
ORA-12704: character set mismatch
SQL>
Пример выполнен в SQL*Plus в немецкой среде, но тоже самое получается в русской и американской среде.
Я нашел одно решение этой проблемы, вот оно:
SQL> select c1 from t1
2 union
3 select to_nchar('1') as c1 from t1;
C1
--------------------------------------------------
1
2
SQL>
Но это решение не очень желательно для наших аппликаций по двум причинам:
- мы стараемся писать одинаковый код как для Oracle, так и для Microsoft SQL Server, в котором, кстати таких проблем с типами данных NCHAR и NVARCHAR нет;
- слишком много мест для изменений в коде аппликаций.
Может быть кому нибудь известно более элегантное решение этой проблемы ?
Согласно рекомендациям Oracle для баз данных межнационального использования, в наших аппликациях мы переводим типы данных с VARCHAR2 на NVARCHAR2 и CHAR на NCHAR, чтобы успешно работать с unicode базами данных, которые имеют database character set равный AL32UTF8 и national character set равный AL16UTF16, с различных клиент-компьютеров, имеющих различные региональные установки (например NLS_LANG=GERMAN_GERMANY.WE8MSWIN1252, NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251, NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 и т.п. с соответствующими значениями параметров Regional and Language Options в Windows операционных системах клиент-компьютеров.
Oказалось, что использование таких типов данных сопряжено с определенными проблемами. Одну из которых я продемонстрирую на примере ниже:
SQL> create table t1 (c1 nvarchar2(50));
Tabelle wurde erstellt.
SQL> insert into t1 values('2');
1 Zeile wurde erstellt.
SQL> select c1 from t1
2 union
3 select '1' as c1 from t1;
select c1 from t1
*
FEHLER in Zeile 1:
ORA-12704: character set mismatch
SQL>
Пример выполнен в SQL*Plus в немецкой среде, но тоже самое получается в русской и американской среде.
Я нашел одно решение этой проблемы, вот оно:
SQL> select c1 from t1
2 union
3 select to_nchar('1') as c1 from t1;
C1
--------------------------------------------------
1
2
SQL>
Но это решение не очень желательно для наших аппликаций по двум причинам:
- мы стараемся писать одинаковый код как для Oracle, так и для Microsoft SQL Server, в котором, кстати таких проблем с типами данных NCHAR и NVARCHAR нет;
- слишком много мест для изменений в коде аппликаций.
Может быть кому нибудь известно более элегантное решение этой проблемы ?
так попробуйте:
select c1 from t1
union
select N'1' as c1 from t1;
И тут почитайте: http://www.oracle.com/technology/tech/globalization/htdocs/global_doc.html
select c1 from t1
union
select N'1' as c1 from t1;
И тут почитайте: http://www.oracle.com/technology/tech/globalization/htdocs/global_doc.html
так попробуйте:Спасибо, это хороший вариант, потому что одинаково подходит для Oracle и Microsoft SQL Server. Но одна из наших апликаций кроме того бежит и на Sybase Adaptive Server Anywhere (ASA). В ASA пока не введен data types NVARCHAR и NCHAR, и видимо поэтому синтакс типа следующего:
select c1 from t1
union
select N'1' as c1 from t1;
И тут почитайте: http://www.oracle.com/technology/tech/globalization/htdocs/global_doc.html
select c1 from t1
union
select N'1' as c1 from t1;
невозможен к применение.
Нет ли в Oracle такого параметра базы данных, который бы глобально разрешал предыдущий синтаксис:
select c1 from t1
union
select '1' as c1 from t1;
в том числе и для колонок таблиц типа NVARCHAR и NCHAR ?
С Oracle, SQL Server и ASA разобрались, теперь при внедрении этого решения в аппликацию, написанную на Power Builder мы столкнулись с проблемами внедрения запроса
select N'1' as c1 from t1
union all
select c1 from t1
в качестве основы для Data Window с Retrieval Argument (вводимым аргументом).
Мы попробовали запрос, на котором делается Data Window с вводимым аргументом сделать так:
SELECT N:sss
from component
where cmpnt_id = 0
union ALL
select cmpnt_name
from component
where cmpnt_id > 0
(получаем ORA-00923)
Может быть кто-то подскажет как технически внедрить запрос с таким синтаксисом в Data Window с Retrieval Argument в Power Bulder версии 10 или 11 ?
Может быть есть ли специализированный форум на русском языке по Power Builder ?
select N'1' as c1 from t1
union all
select c1 from t1
в качестве основы для Data Window с Retrieval Argument (вводимым аргументом).
Мы попробовали запрос, на котором делается Data Window с вводимым аргументом сделать так:
SELECT N:sss
from component
where cmpnt_id = 0
union ALL
select cmpnt_name
from component
where cmpnt_id > 0
(получаем ORA-00923)
Может быть кто-то подскажет как технически внедрить запрос с таким синтаксисом в Data Window с Retrieval Argument в Power Bulder версии 10 или 11 ?
Может быть есть ли специализированный форум на русском языке по Power Builder ?