Делаю запрос на выборку из таблицы. В таблице есть поле типа varchar(100) WIN1251. Если в выборку попадает запись, у которой в значении данного поля стоит строка более чем из 50 русских букв, генерируется исключение Arithmetic exception, numeric overflow, or string truncation. Если в поле стоит короткая строка (менее 50 символов) то выборка работает.
Пробовал Zeos и fblib. Картина одна и та же.
Конфигурация: Win XP SP 3, firebird 1.5.5, lazarus 0.9.26.2.
Как можно выбирать такие записи?
Arithmetic exception ... в запросе на выборку
Модератор: Модераторы
Re: Arithmetic exception ... в запросе на выборку
А вы уверенны, что пишете в таблицу именно в кодеровке Win-1251? 
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
Re: Arithmetic exception ... в запросе на выборку
кодировку подключения поставь в юникод
Re: Arithmetic exception ... в запросе на выборку
Все разобрался. Действительно все из-за кодировок. Спасибо этому форуму.
При подключении у компонента ZConnection или у аналогичного из fblib поставил WIN1251 вместо UTF-8.
И потом в программе строковые данные из программы в базу кодирую функцией UFT8ToAnsi, из базы в программу AnsiToUTF8. Тогда компоненты Query исключение не дают при выборке длинных строк.
И еще если кто использует DBGrid, чтобы он отображал русские строки надо сделать такой обработчик
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DBGrid1.Canvas.TextOut(Rect.left,Rect.Top + 1,AnsitoUTF8(column.Field.Text));
end;
это как раз было где-то тут на форуме. Ну и естественно подключение делать с параметром WIN1251, а не UTF8, дабы не нарваться на вышеописанный глюк.
При подключении у компонента ZConnection или у аналогичного из fblib поставил WIN1251 вместо UTF-8.
И потом в программе строковые данные из программы в базу кодирую функцией UFT8ToAnsi, из базы в программу AnsiToUTF8. Тогда компоненты Query исключение не дают при выборке длинных строк.
И еще если кто использует DBGrid, чтобы он отображал русские строки надо сделать такой обработчик
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DBGrid1.Canvas.TextOut(Rect.left,Rect.Top + 1,AnsitoUTF8(column.Field.Text));
end;
это как раз было где-то тут на форуме. Ну и естественно подключение делать с параметром WIN1251, а не UTF8, дабы не нарваться на вышеописанный глюк.
