c++ получение данных содержащих кириллицу из oracle через ODBC

316
28 января 2017, 10:14

В БД Oracle хранятся данные в которых присутствует кириллица, CHARACTERSET CL8MSWIN1251. Забираю посредством ODBC, вместо кириллицы - знаки вопроса.

std::string kOdbcWrapper::KSQLStatement::getFieldAsString(unsigned short nsColNum)
{
   SQLINTEGER nRlDataSz = 0;
   const unsigned int nBufSize = 256;
   char cBuff[nBufSize]={0};
   std::string sRetStr;
   RETCODE rc = SQLGetData(m_hldStmt->getHandle(), nsColNum,SQL_C_CHAR,cBuff,nBufSize,&nRlDataSz);
   if (rc==SQL_SUCCESS||rc==SQL_SUCCESS_WITH_INFO)
   {
      sRetStr = cBuff;
      return sRetStr;
   }
   if (nRlDataSz>0)
   {
      SQLINTEGER nVecBufSz = nRlDataSz+1;
      std::vector<char> vBuff(nVecBufSz, 0);
      rc = SQLGetData(m_hldStmt->getHandle(), nsColNum, SQL_C_CHAR,
         reinterpret_cast<SQLCHAR *>(&vBuff.front()), nVecBufSz, &nRlDataSz);
      if (rc==SQL_SUCCESS||rc==SQL_SUCCESS_WITH_INFO)
         return std::string(&vBuff[0], vBuff.size());
   }
   return sRetStr;
}
Answer 1

Проблема берёт начало из-за несоответствия кодировок клиента и сервера. Кодировки проверяются через SELECT * nls_session_parameters и SELECT * nls_database_parameters соответственно. Необходимо проверить наличие переменной окружения NLS_LANG на клиенте, и в случае её отсутствия установить её. В моём случае база была в кодировке AMERICAN_AMERICA.CL8MSWIN1251 установив такую же кодировку в NLS_LANG проблема ушла

READ ALSO
Вывод одной строки на каждое имя с учетом метки

Вывод одной строки на каждое имя с учетом метки

Есть таблица stuff_id с полями id и nameЕсть таблица stuff_phone с полями id, phone, preference

308
Ошибки в работе триггера MySQL [дубликат]

Ошибки в работе триггера MySQL [дубликат]

Данный вопрос уже был задан и имеет решение:

355
В боевом режиме виснет сортировка по дате

В боевом режиме виснет сортировка по дате

В локале полный дамп базы - все летаетНа хостинге висим в глушняк (504я)

258