ODBC и NLS_LANG - PullRequest
       18

ODBC и NLS_LANG

2 голосов
/ 18 июня 2010

Допустим, я создал два разных исполняемых файла программы, например, на C ++.

По некоторым причинам внутреннее представление текста в двух программах отличается друг от друга.Допустим, первая программа использует текстовое представление A, а другое текстовое представление B. Это может быть определенная 8-битная кодовая страница ANSI, Unicode / UTF-8 или Unicode / UTF-16 или что-то еще.

Теперь каждыйПрограмма хочет передавать текст (добавлять / извлекать данные) в / из той же таблицы базы данных на сервере (базы данных).Каждая программа связывается с базой данных через ODBC.Таким образом, программы не знают, с какой системой баз данных они общаются.

В этом конкретном случае, хотя база данных фактически является базой данных Oracle RDMS, а администратор сервера базы данных настроил базу данных для использования UTF-8.

В системе, в которой работают программы,соответствующий драйвер ODBC доступен, чтобы программы могли подключаться через ODBC.Каждая программа будет обрабатывать и преобразовывать данные типа ODBC SQL_C_CHAR во внутреннее текстовое представление соответствующим образом.Я предполагаю, что программы не могут сделать ничего другого, кроме как предположить, что для текста SQL_C_CHAR возвращается определенная кодировка.Если нет, нужно указать программам, какая это кодировка.

Для Oracle я знаю, что переменная окружения NLS_LANG может использоваться на клиенте.Я предполагаю, что он влияет на драйвер ODBC (связанный с SQL_C_CHAR) для преобразования из определенной кодировки (как задано NLS_LANG) во внутреннюю кодировку базы данных (в этом примере UTF-8) и наоборот.

Если машина, на которой запущены мои программы, имеет NLS_LANG, этот параметр повлияет на последовательности байтов, возвращаемых для SQL_C_CHAR, поэтому мои программы не могут внезапно принять определенную кодировку для текста, возвращаемого через SQL_C_CHAR.

Этоможно настроить соединение ODBC (желательно программно во время выполнения), чтобы оно надлежащим образом заботилось о преобразованиях текста для двух программ, то есть из / в представление в / из UTF-8 и из / в представление B в / из UTF-8?

С уважением, / Майкл

PS.Поскольку программы соединяются через ODBC, я не думаю, что было бы хорошо, чтобы они теперь что-то говорили о NLS_LANG, поскольку это специфическая переменная среды Orcacle.

1 Ответ

0 голосов
/ 22 июня 2010

Вам необходимо создать приложение с определенным макросом UNICODE (см. Заголовочные файлы sql, такие как sqltypes.h и sqlucode.h).Это изменяет вызовы SQLxxx, которые обычно отображаются на SQLxxxA (ANSI) на SQLxxxW, и поэтому они используют так называемые API-интерфейсы с широкими символами.Это означает, что вы можете передавать юникод (данные, хорошо закодированные в UCS2) в API-интерфейсы SQL и в сочетании с извлечением строковых столбцов в виде SQL_WCHAR вы получите широкие данные из выборок.Возможно, я пропустил это, но я не вижу, чтобы вы упомянули платформу (Windows или UNIX), и это может иметь небольшое значение, если, например, вы используете unix и не используете диспетчер драйверов unixODBC.На сайте MS загружены сведения об Unicode и ODBC.

Существует разумное объяснение Oracle / Unicode / ODBC на Использование драйвера Easysoft ODBC-Oracle с данными Unicode .Он объясняет ODBC и Unicode относительно Oracle / NLS_LANG в контексте C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...