Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TWideStringField.Size - некорректный размер в D2010 / 21 сообщений из 21, страница 1 из 1
02.08.2017, 14:34:28
    #39499044
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
если использовать кодировку UTF8 и dbExpress, то Size дает ровно в 4 раза больше, чем есть на самом деле, хотя в справке сказано
Size is the maximum number of characters in the string.
т.е. именно символов, а не байтов
если ж взять кодировку win1251, то размер правильный

вопрос - это глюк драйвера или ошибка в документации?
склоняюсь к первому, т.к. поля CHAR(1) вдруг на клиенте вырастают до 4 символов и дополняются пробелами

у кого есть возможность, пожалуйста, проверьте в других версиях Delphi новее 2010
...
Рейтинг: 0 / 0
02.08.2017, 14:36:38
    #39499045
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
сорри, БД - FB 2.5 и драйвер, соответственно, dbxfb.dll
...
Рейтинг: 0 / 0
02.08.2017, 16:05:59
    #39499122
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Вася,

XE3

// DataSize is byte count
function TWideStringField.GetDataSize: Integer;
begin
Result := (Size + 1) * 2;
end;
...
Рейтинг: 0 / 0
02.08.2017, 16:08:20
    #39499123
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
DesWindПравильный Вася,

XE3

// DataSize is byte count
function TWideStringField.GetDataSize: Integer;
begin
Result := (Size + 1) * 2;
end;

наверное правильнее переписать так:
Код: pascal
1.
2.
3.
4.
function TWideStringField.GetDataSize: Integer;
begin
  Result := (Size + 1) * SizeOf(Char);
end;
...
Рейтинг: 0 / 0
02.08.2017, 17:09:00
    #39499172
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Васяесли использовать кодировку UTF8 и dbExpress, то Size дает ровно в 4 раза больше, чем есть на самом деле, хотя в справке сказано
За dbExpress не скажу, но System.Length, например, возвращает именно длину в байтах для UTF8 и прочих MBCS и в символах - для Unicode. Возможно это сделано для удобства выделения памяти и/или скорости (чтобы узнать реальную длину строки UTF8 надо полностью проанализировать её содержимое).
...
Рейтинг: 0 / 0
02.08.2017, 17:29:48
    #39499192
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
DesWind,

свойства DataSize и Size - суть разные вещи:
DataSize Indicates the amount of memory needed to store a field component's value.
...
Рейтинг: 0 / 0
09.08.2017, 15:03:31
    #39502655
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
большая просьба

хочу поставить эксперимент с разными версиями драйвера DBXFB.DLL
но у меня есть только от D2010

пришлите на мыло в анкете от других версий, новее, чем D2010
может, там более приемлемое поведение

заранее спасибо
...
Рейтинг: 0 / 0
15.08.2017, 16:03:45
    #39505764
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
судя по вопросам, которые я накопал в интернете по этому поводу, болячка старая и запущенная, появилась вместе с юникодом в BDS-2006
за столько лет вполне могла стать фичей, хоть и недокументированной

это проявляется не только в dbExpress, но и в ADO
не имеет значения и кодировка в БД, важно, что указано в настройках коннекта к БД

из всего этого можно сделать вывод, что драйвер тут вряд ли имеет значение, скорее, где-то во внутренностях компонентов доступа к данным недоработка
...
Рейтинг: 0 / 0
15.08.2017, 18:34:57
    #39505904
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Васяпоявилась вместе с юникодом в BDS-2006

На Юникод Delphi перешла в 2009
Delphi 2005-2006-2007 - в плане юникодности ничем не отличаются от Delphi 4-5-7
...
Рейтинг: 0 / 0
15.08.2017, 18:37:35
    #39505907
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Васяс разными версиями драйвера DBXFB.DLL

а попробуй сторонние драйвера DBX Firebird

есть как минимум китайский и от UniDAC
...
Рейтинг: 0 / 0
20.08.2017, 14:06:39
    #39508018
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
попробовал китайский dbx4fb.dll
хоть он и постоянно обновляется, но у меня работать не захотел:
- на простом SELECT из простой таблицы валится с AV в самом драйвере "read of address 0000000"
- на SELECT CAST( ... AS ... ) - Dynamic SQL error -104 Malformed string, хотя запрос рабочий

попробовал драйвер dbexpida40.dll от DevArt
этот дает правильный размер, но тут другая засада - ему совершенно фиолетово, что указать в параметрах подключения Charset=UTF8 и UseUnicode=True. Charset вообще можно ставить любой, хоть пустой, хоть "Дядя Петя", разницу в результатах работы я не обнаружил

а вот у IBX такое же поведение, как в сабже, т.е. некорректное

итог неутешительный
...
Рейтинг: 0 / 0
28.08.2017, 15:18:13
    #39511729
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
докладываю результаты экспериментов

я оказался прав - все дело в интерпретации драйвером

теперь подробно
--------------------------------------
исследуя исходники IBX, наткнулся на
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function TIBXSQLVAR.GetCharsetSize: Integer;
begin
  case SQLVar.SQLSubtype and $FF of
    0, 1, 2, 10, 11, 12, 13, 14, 19, 21, 22, 39,
    45, 46, 47, 50, 51, 52, 53, 54, 55, 58 :  Result := 1;
    5, 6, 8, 44, 56, 57, 64 : Result := 2;
    3 :
    begin
      // System Tables incorrectly state they are in Unicode_Fss character set but they are not
      if POS('RDB$', SQLVar.RelName) = 1 then
        Result := 1
      else
        Result := 3;
    end;
    59 : Result := 4;
    else
      Result := 1;
  end;
end;


как видно, в код жестко зашиты идентификаторы чарсетов, причем для UTF8=59
это очень нехорошо, но для IBX, предназначенных для работы с InterBase, это простительно
однако простой анализ таблицы RDB$CHARACTER_SETS в БД на FireBird показывает, что там для UTF8 идентификатор=4, а код 59 соответствует чарсету WIN1256
для эксперимента подсоединяемся к БД с этим чарсетом (хоть через IBX, хоть через dbExpress) и - вуаля! - размер поля на клиенте становится корректным

из всего этого можно сделать несколько выводов:
1. в момент разветвления IB6 и FB1 идентификаторы чарсетов совпадали, но дальше каждый разработчик добавлял новые чарсеты со своими ID по своему усмотрению и в свой момент
2. драйвер dbxfb.dll явно делался по исходникам для dbxint.dll, возможно, условной компиляцией отдельных кусочков (в бинарнике четко прослеживаются имена модулей с "IB", а также присутствует SQL-тип данных BOOLEAN, которого в 2010 г в FB еще не было)
3. программисты драйвера наверняка тоже зашили в код ID чарсетов вместо того, чтобы считать и интерпретировать корректно данные из RDB$CHARACTER_SETS
...
Рейтинг: 0 / 0
28.08.2017, 15:29:07
    #39511745
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
большая просьба!

у кого есть официальная учетка Embarcadero, зарегистрируйте баг-репорт по этому поводу

очень уж неприятно вылавливать таких блох на ровном месте, да еще и чувствовать, что к FB относятся как к бедному родственнику

PS
замечу, что с драйвером от Delphi 10.1 такая же фигня (другие на проверял, но вряд ли дело сдвинулось), т.е. тянется уже много лет, а исправить код драйвера, имхо, работы им на пару часов
...
Рейтинг: 0 / 0
28.08.2017, 16:03:58
    #39511775
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
никто не будет править IBX, когда есть FireDAC
...
Рейтинг: 0 / 0
28.08.2017, 16:26:10
    #39511785
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Васячувствовать, что к FB относятся как к бедному родственникуНикто никогда не обещал поддержку FB IBX'ом. http://www.ibase.ru/ibx/ Тамк красным по белому выделен ворнинг

И выдержка из FAQ
http://www.ibase.ru/unicode_faq/ ПОДДЕРЖКА UTF8 В INTERBASE И FIREBIRD ОДИНАКОВАЯ?

К сожалению, нет. Причем, неодинаковых аспектов много.

В rdb$character_sets кодировка UTF8 имеет в Firebird идентификатор 4 (это был свободный номер рядом с давно имеющейся в IB и FB кодировкой UNICODE_FSS с ID = 3), а в InterBase – 59. Код 59 в Firebird имеет кодировка WIN1256. То есть, разработчики InterBase не ставили перед собой вопрос обеспечения совместимости с Firebird в этом плане.

Начиная с Firebird 1.5 при получении строковых данных CHAR и VARCHAR с сервера, если это не кодировки NONE или OCTETS, и если кодировка коннекта не NONE, то в sqlsubtype передается: в старшем байте код collate, а в младшем – код character set.

В InterBase также передается код collate в sqlsubtype, однако, с какой именно версии, неизвестно. Возможно, с 2009, т. к. IBX в Delphi 2010 содержит изменения на эту тему (см. в конце FAQ).
...
Рейтинг: 0 / 0
28.08.2017, 16:33:17
    #39511789
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
_Vasilisk_Никто никогда не обещал поддержку FB IBX'ом
krapotkinникто не будет править IBX, когда есть FireDAC
почему вы уцепились за IBX ???
почитайте сабж, там dbExpress

IBX употреблен только в цепочке изучения проблемы
а по поводу FAQ - увы, не читал, бывает
сам нашел, в чем проблема, хоть и убил кучу времени

но dbExpress для FB не работает, как обещано, вот и прошу баг-репорт сделать
...
Рейтинг: 0 / 0
28.08.2017, 17:09:29
    #39511813
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Вася большая просьба!

у кого есть официальная учетка Embarcadero, зарегистрируйте баг-репорт по этому поводу



В чем проблема зарегистрироваться самому ?
...
Рейтинг: 0 / 0
28.08.2017, 17:34:02
    #39511824
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Васяно dbExpress для FB не работает, как обещаноЗавязываться на dbExpress при наличии лучших аналогов, в т.ч. FireDAC - это просто глупо.
...
Рейтинг: 0 / 0
28.08.2017, 17:57:44
    #39511840
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Гаджимурадов РустамЗавязываться на dbExpress при наличии лучших аналогов, в т.ч. FireDAC - это просто глупо.
глупо не читать топик (в моей версии нет таких компонентов)
глупо давать советы не по сути вопроса (я ж не предлагаю купить танк, если вдруг Ландровер застрял в поле)

а еще глупо при каждом появлении нового инструмента все переделывать под него, заменяя рабочий инструмент с известными шероховатостями на новый с неизвестными занозами, - и все это в угоду распальцовкам
...
Рейтинг: 0 / 0
28.08.2017, 18:34:04
    #39511853
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Вася> глупо не читать топик (в моей версии нет таких компонентов)

Я читал. Да, покупать придётся отдельно, но если приложение
коммерческое, а не "для себя" - то всё равно дешевле выйдет.
Тем более, что есть и "более бесплатные" аналоги.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.08.2017, 09:18:37
    #39512000
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TWideStringField.Size - некорректный размер в D2010
Правильный Васяглупо не читать топик
глупо не думать. эмро вносит исправления только в действующие версии. и то там такие критичные живут, что ...
так что тикет по каким-то олдскульным компонентам из версии 2.0 абсолютно бесполезен
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TWideStringField.Size - некорректный размер в D2010 / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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