powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
7 сообщений из 7, страница 1 из 1
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
    #40052699
Prot_XT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычная таблица, ничего примечательного, поле типа VARCHAR (40) при изменении значения поля, если строка больше 35 символов получаю ошибку:

Код: pascal
1.
 [FireDAC][Phys][PG]-345. Data too large for variable [NEW_pg_address]. Max len = [120], actual len = [68] Hint: set the TFDParam.Size to a greater value.


Если увеличиваю или уменьшаю количество символов в столбце с 40 до 100... получаю тоже самое, только предел символов меняется.
В чем прикол непонятно. Ясно, что что-то с FireDAC, кто сталкивался, как обойти?
...
Рейтинг: 0 / 0
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
    #40052703
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prot_XT
как обойти?
Можно в лоб: прочитать сообщение об ошибке
Prot_XT
Код: pascal
1.
Hint: set the TFDParam.Size to a greater value

Можно по уму: посмотреть исходники и подумать что не так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
function TPgVariable.FD2PgData(AType: TPgType; ASource: Pointer; ASourceLen: Integer; 
  var ADest: Pointer; var ADestLen: LongWord; var ADestFormat: Integer;
  AByRef: Boolean): Boolean;
......
begin
  ......
  case AType.Id of
    ......
  SQL_NAME,
  SQL_CHAR,
  SQL_BPCHAR,
  SQL_VARCHAR,
  SQL_UNKNOWN,
  SQL_ACLITEM:
    begin
      if (paFixed in AType.Attrs) and Statement.StrsTrim then
        if FEncoding = ecUTF16 then
          while (ASourceLen > 0) and (PWideChar(ASource)[ASourceLen - 1] = ' ') do
            Dec(ASourceLen)
        else
          while (ASourceLen > 0) and (PFDAnsiString(ASource)[ASourceLen - 1] = TFDAnsiChar(' ')) do
            Dec(ASourceLen);
      if Statement.StrsEmpty2Null and (ASourceLen = 0) then
        Result := False;
      if Result then begin
        if (FEncoding = ecANSI) and (Statement.FConnection.Encoder.Encoding = ecANSI) then begin
          iByteLen := ASourceLen * SizeOf(TFDAnsiChar);
          Move(ASource^, ADest^, iByteLen);
        end
        else begin
          pRes := nil;
          iByteLen := Statement.FConnection.Encoder.Encode(ASource, ASourceLen, pRes, FEncoding);
          iMaxChars := ADestLen - 1;
          if FEncoding = ecUTF16 then
            iMaxChars := iMaxChars div SizeOf(WideChar);
          if iByteLen > iMaxChars then
            if Statement.StrsTrim2Len then
              iByteLen := iMaxChars
            else
              ErrorDataTooLarge(ADestLen, iByteLen);
          Move(pRes^, ADest^, iByteLen);
        end;
      end
      else
        iByteLen := 0;
      ADestLen := iByteLen;
    end;
  ......
end;

...
Рейтинг: 0 / 0
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
    #40052722
AWSVladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prot_XT

У тебя поди база с UTF-8, а если ты пишешь русскими буквами, умножай нужное ко-во на 2 т.к. русские символы по 2 байта кодируются или таблицу делай Win1251
...
Рейтинг: 0 / 0
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
    #40052723
Prot_XT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

Можно по уму: посмотреть исходники и подумать что не так


Нет у меня исходников... у меня Community Edition.
Мне все-равно непонятно почему так происходит? Так не должно быть. Обычный датасет и грид. Должны вводиться все 40 символов дальше тупо не печататься. На первый взгляд, что бросается в глаза - это то что в базе UTF-8. 40 символов на 3 байта - это Max len = [120]. А это что такое - actual len = [68]? Ошибку перестает давать, когда actual len становится = 60. Т.е. половину от Max len;

Как установить TFDParam.Size больше понятия не имею для RequestLive:= True;
Можно конечно размер поля сделать больше, но это просто костыли какие-то...
...
Рейтинг: 0 / 0
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
    #40052724
Prot_XT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AWSVladimir
Prot_XT

У тебя поди база с UTF-8, а если ты пишешь русскими буквами, умножай нужное ко-во на 2 т.к. русские символы по 2 байта кодируются или таблицу делай Win1251

Ну да, UTF-8... я может туплю, но умножать на 2 что? И вообще почему только с FireDAC такие проблемы возникают? И кстати... не на всех таблицах. В других отрабатывает корректно. Набрал нужное количество символов и стоп... а тут в AV вываливается.
...
Рейтинг: 0 / 0
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
    #40052726
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prot_XT
Нет у меня исходников... у меня Community Edition.
Я вам показал исходники
Prot_XT
А это что такое - actual len = [68]?
Это размер введенной строки в байтах. Для UTF-8 можно грубо прикинуть длину так: кириллический символ - 2 байта, остальные - 1 байт. Точно - вот так
Код: pascal
1.
ByteCount := TEncoding.UTF8.GetByteCount(str);


Prot_XT
костыли какие-то...
Судя по документации к Postgre VARCHAR(n) описывает размер поля в символах. Так что зачем FireDAC полез считать байты - мне не понятно
...
Рейтинг: 0 / 0
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
    #40052767
Prot_XT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ ,
В общем ясно... это везде так. Раньше просто внимания не обращал. Все от текста зависит. Ну ок, будем иметь это в виду... перед записью посчитаем побайтно.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]