|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
Под Oracle 8.1.5 есть БД со следующими настройками языков: - основная кодировка 1251 - национальная кодировка UTF8 Имеется также Oracle ODBC Driver версии 8.1.5.7.0. Сейчас в теле запроса на вставку используется TRANSLATE(? USING NCHAR_CS), UNICODE строка перед вызовом SQLBindParameter конвертируется в 1251, биндится и выполняется запрос. В противном случае получается ошибка: [Oracle][ODBC][Ora]ORA-12704: character set mismatch HY000. Вопрос: Можно ли передать в NCHAR поле UNICODE строку без переконвертации ее в 1251? PS: На 9.0.1.1.1 с теми же настройками БД, но с использованием UNISTR, результат тот же. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2002, 19:12 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
Вот, что возвращает: select * from nls_database_parameters; PARAMETER VALUE ------------------------------ ---------------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET CL8MSWIN1251 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-YY NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-YY HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM NLS_TIMESTAMP_TZ_FORMAT DD-MON-YY HH.MI.SSXFF AM TZH:TZM NLS_DUAL_CURRENCY $ NLS_COMP NLS_NCHAR_CHARACTERSET UTF8 NLS_RDBMS_VERSION 8.1.5.0.0 18 rows selected ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2002, 19:17 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
"- основная кодировка 1251 - национальная кодировка UTF8 " А кто подсказал что надо так делать? Надо было обе 1251 сделать ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 09:36 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
у меня тоже подобная ситуация NLS_CHARACTERSET US7ASCII NLS_NCHAR_CHARACTERSET AL16UTF16 естественно не работает конвертация букв между регистрами, может кто подскажет, что делать ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 09:49 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
To: softbuilder@inbox.ru >> А кто подсказал что надо так делать? >> Надо было обе 1251 сделать Что бы мне это дало, если надо хранить и 1251, и Unicode? To: All Кто-нибудь из гуру может помочь? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 10:58 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
"Что бы мне это дало, если надо хранить и 1251, и Unicode?" Надо для чего? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 11:01 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
>> Надо для чего? Создается свое хранилище под MS Outlook, а у него есть два типа строк: ANSI и Unicode. Решение-то я нашел, но оно, как следует из описания, кривое, т.к. при переконвертации Unicode -> ANSI, возможна потеря символов. К тому же Oracle потом все равно приводит полученную строку обратно к Unicode. Два лиших преобразования. Под MS SQL 7/2K Unicode строки через API передаются как есть даже когда кодировка БД отлична от Unicode. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 11:06 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
"т.к. при переконвертации Unicode -> ANSI, возможна потеря символов." По идее никакой потери символов не должно быть. Вся первичная информация обычно поступает в кодировке ANSI, никакой проблемы при конвертации не должно быть. Проблема обычно бывает в следующем: при конвертации программер считает что к нему пришла информация скажем в 1251, а реально она в koi8. Поэтому при конвертации в Unicode помещается неправильная информация. Естественно, что потом при обратной конвертации как не изощряйся ничего не получишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 11:46 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
>> По идее никакой потери символов не должно быть. >> Вся первичная информация обычно поступает в кодировке ANSI, >> никакой проблемы при конвертации не должно быть. Быть может, но все же мне интересно было бы узнать существует ли возможность передавать в Oracle строки в национальной кодировке, без преобразования к основной кодировке БД. Как бы об этом и был вопрос, а то, что будет там потеря или нет, - уже мало интересно. Т.к., если существует такая возможность, ею надо пользоваться и не терзать себя вопросами как оно там дойдет до СУБД :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 12:50 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
Насколько я понимаю, Unicode использовать есть смысл, когда у тебя информация приходит в кодировках разных языков. Допустим, клиенты являются корейцами, русскими, китайцами, американцами. Корейцы и китайцы используют иероглифы, русские и американцы ANSI. Естественно что в этом случае или надо две базы создавать с разными кодировками или одну с Unicode. Значит ты хочешь сказать, что твой случай именно этот? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 13:38 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
>> Естественно что в этом случае или надо две базы создавать с разными кодировками или одну с Unicode. Две базы держать расточительно, да и ссылочная целостность будет малость похрамывать... :) Насчет создания одной БД с основной кодировкой Unicode идея и меня посещала, но тогда мои 1251 строки будут для нее национальными и потребуется явное преобразование, хотя я могу ошибаться и нормально пройдет неявное преобразование средствами самого Oracle. >> Значит ты хочешь сказать, что твой случай именно этот? Не совсем так... Мне нужны и ANSI, и Unicode строки одновременно. Сделал вывод, что народ не практикует использование национальной кодировки, а работает только с основной. :( Тема похоже исчерпала себя. Спасибо за участие. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 13:50 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
Мне кажется ты неправильно понимаешь использования и предназначения кодировок. То что ты назвал "основной кодировкой" - эта кодировка используется не для хранения данных, а для хранения исходного кода SQL и PL/SQL. А национальная кодировка представяляет данные для данных. Если ты подумал, что для базы одновременно используются две кодировки для хранения данных, ты просто ошибаешься. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 14:10 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
To softbuilder@inbox.ru: Ай-ай-ай... Нехорошо... >> Если ты подумал, что для базы одновременно используются две кодировки >> для хранения данных, ты просто ошибаешься. Кажется тут заблуждение уже у тебя. Привожу выдержку из Oracle9i Globalization Support Guide Release 1 (9.0.1) (Part Number A90236-02), 2 - Choosing a Character Set, Restrictions on Character Sets Used to Express Names and Text: The character encoding scheme used by the database is defined at database creation as part of the CREATE DATABASE statement. All SQL CHAR datatype columns (CHAR, CLOB, VARCHAR2, and LONG), including columns in the data dictionary, have their data stored in the database character set. In addition, the choice of database character set determines which characters can name objects in the database. SQL NCHAR datatype columns (NCHAR, NCLOB, and NVARCHAR2) use the national character set. Ясно видно, что в БД используется __ДВЕ__ кодировки: основная (определяется параметром NLS_CHARACTERSET) и национальная (определяется параметром NLS_NCHAR_CHARACTERSET). Так же указывается для чего нужна каждая из них. Иначе, зачем по твоему, при создании новой БД Oracle Database Configuration Assistant спрашивает параметры для database character set и national character set? Ж:) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 15:16 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
Я же написал для чего основная: для текстов SQL и PL/SQL. Например ты пишешь текст запроса select * from clints_info where name_client='Петров'. Или в процедуре. А национальная используется для самих данных в таблицах ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 16:03 |
|
Передача UNICODE через ODBC
|
|||
---|---|---|---|
#18+
To: softbuilder@inbox.ru Так ведь и я о том же!!! Помнишь чьи слова были: Если ты подумал, что для базы одновременно используются две кодировки для хранения данных, ты просто ошибаешься. Так вот, тут твоя ошибка. А с последним твоим постом я согласен на все 100%, это ясно как день. Но не в тему :( ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2002, 16:30 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1992654]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
12ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 250ms |
total: | 387ms |
0 / 0 |