Проблема ZEOS + ORACLE

Модератор: Модераторы

Проблема ZEOS + ORACLE

Сообщение Alex333 » 31.03.2013 18:13:39

Всем привет.
У меня Windows XP SP3 + Lazarus 1.0.8 + FPC 2.6.2 + Zeos 7.0.3 (Stable).
ORACLE 10 XE
В ORACLE есть таблица:
create table TESTTABLE
(
test VARCHAR2(4)
) ... и пр.

Есть TZReadOnlyQuery, у которого SQL равен "select TEST from testtable"
В таблице одна запись.

Так вот. Если заполнять поле английскими буквами, проблем нет. А вот если русскими - всё нормально только в том случае, если поле заполнено наполовину длины. Отображается русский текст в форме тоже нормально.
А стоит туда внести 'АБВ', например, и после вот этого

procedure TForm1.Button2Click(Sender: TObject);
begin
ZReadOnlyQuery1.Open;
end;

возникает исключение OCI_ERROR: ORA-01406: fetched column value was truncated.

Сообщение я понимаю, но не могу въехать в его смысл. Такое ощущение, что этот ZEOS в таком случае передаёт ораклу маленький буфер где-то у себя внутри. Или я чего-то не понимаю. А вот если, скажем, в ORACLE делаю поле nvarchar(4), то всё нормально. Но мне это не подходит - я не хозяин той оракловой базы, к которой цепляюсь.
Кто виноват и что делать? Решение вроде должно быть каким-то простым (с возгласом "Семён Семёныч!..." :-) )

P.S. попробовал зарегистрироваться на форуме ZEOS. Они всё время мне пишут, что моя регистрация - спам. Ну, не хотят - как хотят.
Подскажите что-нибудь дельное.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Re: Проблема ZEOS + ORACLE

Сообщение Little_Roo » 31.03.2013 19:16:02

Alex333 писал(а):Если заполнять поле английскими буквами, проблем нет. А вот если русскими - всё нормально только в том случае, если поле заполнено наполовину длины.

Проблемы с UTF8 ?
Здесь на форумах тема разбиралась...
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Проблема ZEOS + ORACLE

Сообщение Alex333 » 31.03.2013 22:04:20

Полазил-полазил по форумам, и ничего не нашёл.
В итоге полез в исходники этой ZEOS и нагло добавил ей 2 строчки:
Код: Выделить всё
procedure InitializeOracleVar(PlainDriver: IZOraclePlainDriver;
  Connection: IZConnection; var Variable: PZSQLVar;
  DataType: TZSQLType; OracleType: ub2; DataSize: Integer);
var
  Length: Integer;
  OracleConnection: IZOracleConnection;
begin
  //
  if Variable.ColType = stString then
    DataSize := DataSize * 2;  //Корректировочка с учётом UTF8
  //
  ....

Пока что работает нормально.
Кто знает более изящный способ - подскажите сапожнику.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Re: Проблема ZEOS + ORACLE

Сообщение Vapaamies » 01.04.2013 12:12:39

Alex333 писал(а):Кто знает более изящный способ - подскажите сапожнику.

Умножать на 3. Символы вроде типографского тире (—) или ™ занимают 3 байта. А по-хорошему, проблема должна решаться на уровне компонентов. Лет 10 тому назад, когда Oracle только вводил UTF-8, всякие DOA и ODAC тоже не умели нормально с ним работать, приходилось изгаляться.

Что стоит в настройках клиента Oracle, кстати? Интересует NLS_LANG.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Проблема ZEOS + ORACLE

Сообщение Alex333 » 01.04.2013 12:41:05

> Что стоит в настройках клиента Oracle, кстати? Интересует NLS_LANG.

И на клиенте, и на сервере NLS_LANG = AMERICAN_AMERICA.CL8MSWIN1251

Тогда мне ещё больше стало не понятно. Получается, в UTF8 его переводит клиент, т.е. ZEOS? И причём тут тогда размер переменной, которая создается для приёма данных из ORACLE? Вроде должно и так хватать. Хотя, конечно, я не отрицаю, что принцип могу не понимать вовсе. Поясните тогда.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28

Re: Проблема ZEOS + ORACLE

Сообщение Vapaamies » 01.04.2013 13:24:18

Alex333 писал(а):И на клиенте, и на сервере NLS_LANG = AMERICAN_AMERICA.CL8MSWIN1251

Задам традиционный вопрос техподдержки: а вы уверены, что этот NLS_LANG установлен в той версии ORACLE_HOME, что реально используется? Сколько ORACLE_HOME на машине? 32 или 64 бита?

Alex333 писал(а):Получается, в UTF8 его переводит клиент, т.е. ZEOS?

Не знаю, с ZEOS не работал. Но раз ошибка возникает на уровне OCI, кто-то именно UTF-8 запрашивает.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 291
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Проблема ZEOS + ORACLE

Сообщение Alex333 » 01.04.2013 14:55:25

> Задам традиционный вопрос техподдержки: а вы уверены, что этот NLS_LANG установлен в той версии ORACLE_HOME, что реально используется?
> Сколько ORACLE_HOME на машине? 32 или 64 бита?

:-) Я тоже немного занимаюсь техподдержкой, и эти вещи мне очень хорошо знакомы. Особенно часто приходится спрашивать, какой HOME в переменной окружения PATH стоит первым :-)

На домашнем компе стоит всего один клиент.
Alex333
новенький
 
Сообщения: 32
Зарегистрирован: 21.08.2011 19:14:28


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 5

Рейтинг@Mail.ru