SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Не конвертируется blob sub_type 1 при пересылке
icon5.gif  Не конвертируется blob sub_type 1 при пересылке [сообщение #587] Wed, 14 September 2022 22:54 Переход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 133
Зарегистрирован: August 2022
Senior Member
Символьные данные CHAR и VARCHAR при отправке клиенту конвертируются из родного набора символов в charset, заданный соединением. Это удобно. А вот с данными типа BLOB sub_type TEXT такого не происходит, они приходят "сырыми". Это так и задумано? Красивая симметрия символьных типов несколько теряется.
Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #589 является ответом на сообщение #587] Thu, 15 September 2022 00:34 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 328
Зарегистрирован: August 2022
Senior Member
А у меня - происходит. Какую версию сервера ты используешь и что у тебя в SQLDA для этого BLOB при fetch?
Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #591 является ответом на сообщение #589] Thu, 15 September 2022 12:15 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время в онлайне  МП
Сообщений: 769
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
и DDL хотелось бы увидеть.
Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #595 является ответом на сообщение #591] Thu, 15 September 2022 18:51 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 133
Зарегистрирован: August 2022
Senior Member
Может быть, может быть... Не могу понять, где не так, но где-то точно не так. Тесты и их результаты показаны ниже. Я так полагал, что если данные "сами" конвертируются при пересылке, то всегда должны приходить корректные строки, т.е. в том charset, который установлен соединением. Кстати, в isql с varchar UTF8 такая же история, как и с blob UTF8 происходит. А вот в IBExpert - не такая. Там для varchar всегда все хорошо. Для blob - не всегда, но в меньших случаях. Эти же тесты в IBExpert дают другие результаты. Например, если blob возвращается процедурой, тоже все хорошо, а если функцией - плохо. Но на IBExpert ориентироваться трудно, у него могут быть свои соображения по конвертации приходящих данных.

Короче, ничего не понятно. Жить, однако, можно.

RDB$DATABASE.$RDB$CHARACTER_SET_NAME = WIN1251
VI-V4.0.2.2816 Firebird 4.0

Тест с функцией и его результаты:

isql.exe -u 'SYSDBA' -p 'masterkey' test
Database: test, User: SYSDBA
SQL> set names WIN1251;
SQL>
SQL> set term ^;
SQL>
SQL> create or alter function TEST_BLOB_FUNC
CON> returns blob sub_type 1 character set UTF8
CON> as
CON> begin
CON>     return _utf8 x'D180D183D181D181D0BAD0B8D0B520D0B1D183D0BAD0B2D18B'; --'русские буквы'
CON> end^
SQL>
SQL> set term ;^
SQL>
SQL> select
CON>       test_blob_func()                                                  as  raw_data_UTF8
CON>     , cast( test_blob_func() as blob sub_type 1 character set UTF8    ) as cast_data_UTF8
CON>     , cast( test_blob_func() as blob sub_type 1 character set WIN1251 ) as cast_data_WIN1251
CON>   from rdb$database;

    RAW_DATA_UTF8    CAST_DATA_UTF8 CAST_DATA_WIN1251
================= ================= =================
              0:6               0:5               0:4
==============================================================================
RAW_DATA_UTF8:
СЂСѓСЃСЃРєРёРµ Р±СѓРєРІС‹
==============================================================================
==============================================================================
CAST_DATA_UTF8:
СЂСѓСЃСЃРєРёРµ Р±СѓРєРІС‹
==============================================================================
==============================================================================
CAST_DATA_WIN1251:
русские буквы
==============================================================================
SQL>
Тест с процедурой и его результаты:

isql.exe -u 'SYSDBA' -p 'masterkey' test
Database: test, User: SYSDBA
SQL> set names WIN1251;
SQL>
SQL> set term ^;
SQL>
SQL> create or alter procedure TEST_BLOB_PROC
CON> returns(
CON>     BLOB_RESULT blob sub_type 1 character set UTF8
CON> )as begin
CON>     BLOB_RESULT = _utf8 x'D180D183D181D181D0BAD0B8D0B520D0B1D183D0BAD0B2D18B'; --'русские буквы'
CON>     suspend;
CON> end^
SQL>
SQL> set term ;^
SQL>
SQL> select
CON>       BLOB_RESULT                                                  as  raw_data_utf8
CON>     , cast( BLOB_RESULT as blob sub_type 1 character set UTF8 )    as cast_data_urtf8
CON>     , cast( BLOB_RESULT as blob sub_type 1 character set WIN1251 ) as cast_data_win1251
CON>   from
CON>     test_blob_proc;

    RAW_DATA_UTF8   CAST_DATA_URTF8 CAST_DATA_WIN1251
================= ================= =================
              0:1               0:1               0:4
==============================================================================
RAW_DATA_UTF8:
СЂСѓСЃСЃРєРёРµ Р±СѓРєРІС‹
==============================================================================
==============================================================================
CAST_DATA_URTF8:
СЂСѓСЃСЃРєРёРµ Р±СѓРєРІС‹
==============================================================================
==============================================================================
CAST_DATA_WIN1251:
русские буквы
==============================================================================
SQL>

[Обновления: Thu, 15 September 2022 18:53]

Известить модератора

Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #596 является ответом на сообщение #595] Fri, 16 September 2022 00:24 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 133
Зарегистрирован: August 2022
Senior Member
Виноват, эксперимент был не вполне корректен, для isql соединения charset не был выставлен. Теперь выставил, но результат еще удивительнее. Хотя, наверное, это консоль не умеет выводить UTF8. Да, точно, консоль. Ладно, прошу прощения, был неправ.

isql.exe -u 'SYSDBA' -p 'masterkey' test -ch WIN1251
Database: test, User: SYSDBA
SQL> select
CON>       test_blob_func()                                                 as  raw_data_UTF8
CON>    , cast( test_blob_func() as blob sub_type 1 character set UTF8    ) as cast_data_UTF8
CON>    , cast( test_blob_func() as blob sub_type 1 character set WIN1251 ) as cast_data_WIN1251
CON>  from rdb$database;

RAW_DATA_UTF8           CAST_DATA_UTF8 CAST_DATA_WIN1251
==================== ================= =================
русские буквы                      0:6               0:2
==============================================================================
CAST_DATA_UTF8:
русские буквы
==============================================================================
==============================================================================
CAST_DATA_WIN1251:
русские буквы
==============================================================================

SQL> exit;

isql.exe -u 'SYSDBA' -p 'masterkey' test -ch UTF8
Database: test, User: SYSDBA
SQL> select
CON>       test_blob_func()                                                 as  raw_data_UTF8
CON>    , cast( test_blob_func() as blob sub_type 1 character set UTF8    ) as cast_data_UTF8
CON>    , cast( test_blob_func() as blob sub_type 1 character set WIN1251 ) as cast_data_WIN1251
CON>  from rdb$database;

RAW_DATA_UTF8           CAST_DATA_UTF8 CAST_DATA_WIN1251
==================== ================= =================
СЂСѓСЃСЃРєРёРµ Р±СѓРєРІС‹                      0:6               0:5
==============================================================================
CAST_DATA_UTF8:
СЂСѓСЃСЃРєРёРµ Р±СѓРєРІС‹
==============================================================================
==============================================================================
CAST_DATA_WIN1251:
СЂСѓСЃСЃРєРёРµ Р±СѓРєРІС‹
==============================================================================

SQL>

[Обновления: Fri, 16 September 2022 00:25]

Известить модератора

Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #597 является ответом на сообщение #596] Fri, 16 September 2022 00:42 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 328
Зарегистрирован: August 2022
Senior Member
Консоль умеет, но я не вижу у тебя в логе 'chcp 65001'.
Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #602 является ответом на сообщение #587] Sat, 17 September 2022 23:32 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 282
Зарегистрирован: June 2022
Senior Member
А каковы расходы на такую перекодировку? Не проще ли сразу использовать юникод?
Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #605 является ответом на сообщение #602] Mon, 19 September 2022 09:44 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 287
Зарегистрирован: June 2022
Senior Member
Расходы есть. Я бы не назвал их большими, но они есть.
Но надо учитывать, что есть Legacy приложения, которые написаны на старых дельфи без поддержки юникода.
И есть старые БД, перевести на UTF8 которые не так просто. Поэтому иногда таких перекодировок не избежать.

И ещё UTF8 занимает больше места, записи становятся длиннее, их меньше помещается на одной странице, следовательно выборки становятся медленнее.
В 5ке RLE будет улучшен, чтобы UTF8 не было сильно дороже однобайтовых кодировок при длине строк больше 32 символов (128 байт).

[Обновления: Mon, 19 September 2022 09:58]

Известить модератора

Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #607 является ответом на сообщение #605] Mon, 19 September 2022 20:44 Переход к предыдущему сообщениюПереход к следующему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 56
Зарегистрирован: July 2022
Member
sim_84 писал(а) Mon, 19 September 2022 09:44

В 5ке RLE будет улучшен, чтобы UTF8 не было сильно дороже однобайтовых кодировок при длине строк больше 32 символов (128 байт).
Интересненько... а "пустоты" получится оптимизировать? Ну, например, строки по 1024 символов UTF8, которые содержат NULL сколько байтов будут "жрать" на диске.
Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #608 является ответом на сообщение #587] Mon, 19 September 2022 21:06 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 287
Зарегистрирован: June 2022
Senior Member
Да получится. 4 байта будет занимать. Собственно я уже тестил наработки ДЕ.
На github можно посмотреть исходный код этой ветки, там в комментариях схема кодирования описана.

[Обновления: Mon, 19 September 2022 21:17]

Известить модератора

Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #609 является ответом на сообщение #608] Mon, 19 September 2022 22:04 Переход к предыдущему сообщению
ggreggory в настоящее время не в онлайне  ggreggory
Сообщений: 56
Зарегистрирован: July 2022
Member
sim_84 писал(а) Mon, 19 September 2022 21:06
4 байта будет занимать.
Обалдеть! Жаль, что я уже с полуторки на 3-ку перешел. Полгода страданий со строками при переходе на UTF8. Базы пухли, скорость падала. А всего-то надо было, дождаться 5-ки )
Предыдущая тема: Как в приложении одновременно использовать fbembedded разных версий?
Следующая тема: BIN_AND() в Firebird 4.0?
Переход к форуму:
  


Текущее время: Thu Mar 28 19:43:09 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00910 секунд