Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable / 7 сообщений из 7, страница 1 из 1
11.03.2021, 19:30
    #40052699
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
Обычная таблица, ничего примечательного, поле типа 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
11.03.2021, 19:53
    #40052703
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
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
11.03.2021, 21:06
    #40052722
AWSVladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
Prot_XT

У тебя поди база с UTF-8, а если ты пишешь русскими буквами, умножай нужное ко-во на 2 т.к. русские символы по 2 байта кодируются или таблицу делай Win1251
...
Рейтинг: 0 / 0
11.03.2021, 21:13
    #40052723
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
_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
11.03.2021, 21:19
    #40052724
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
AWSVladimir
Prot_XT

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

Ну да, UTF-8... я может туплю, но умножать на 2 что? И вообще почему только с FireDAC такие проблемы возникают? И кстати... не на всех таблицах. В других отрабатывает корректно. Набрал нужное количество символов и стоп... а тут в AV вываливается.
...
Рейтинг: 0 / 0
11.03.2021, 21:39
    #40052726
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
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
12.03.2021, 04:45
    #40052767
Prot_XT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable
_Vasilisk_ ,
В общем ясно... это везде так. Раньше просто внимания не обращал. Все от текста зависит. Ну ок, будем иметь это в виду... перед записью посчитаем побайтно.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC, Delphi 10.3.3, PostgreSQL 11.10 Data too large for variable / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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