Начало » Использование СУБД » Firebird, HQbird, InterBase » Не конвертируется blob sub_type 1 при пересылке
|
|
|
Re: Не конвертируется blob sub_type 1 при пересылке [сообщение #595 является ответом на сообщение #591] |
Thu, 15 September 2022 18:51 |
shalamyansky
Сообщений: 150 Зарегистрирован: 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
Сообщений: 150 Зарегистрирован: 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 при пересылке [сообщение #605 является ответом на сообщение #602] |
Mon, 19 September 2022 09:44 |
sim_84
Сообщений: 332 Зарегистрирован: June 2022
|
Senior Member |
|
|
Расходы есть. Я бы не назвал их большими, но они есть.
Но надо учитывать, что есть Legacy приложения, которые написаны на старых дельфи без поддержки юникода.
И есть старые БД, перевести на UTF8 которые не так просто. Поэтому иногда таких перекодировок не избежать.
И ещё UTF8 занимает больше места, записи становятся длиннее, их меньше помещается на одной странице, следовательно выборки становятся медленнее.
В 5ке RLE будет улучшен, чтобы UTF8 не было сильно дороже однобайтовых кодировок при длине строк больше 32 символов (128 байт).
[Обновления: Mon, 19 September 2022 09:58] Известить модератора
|
|
|
|
|
|
Переход к форуму:
Текущее время: Sun Dec 22 14:26:55 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00854 секунд
|