powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Литеральный блоб - кодировка character set UTF8
25 сообщений из 33, страница 1 из 2
Литеральный блоб - кодировка character set UTF8
    #39939409
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Создание базы и подключение character set WIN1251

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create view V (
    B_UTF8,
    B_1251 )
as
select cast ( 'BLOB' as blob sub_type text ) as B_UTF8,
       cast ( 'BLOB' as blob sub_type text character set WIN1251 ) as B_1251
  from RDB$DATABASE
;


Для B_UTF8 кодировка UTF8, для B_1251 - WIN1251.

Без указания character set кодировка по умолчанию UTF8.
Это так и должно быть?

С уважением, Polesov.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939414
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20.03.2020 10:38, Polesov пишет:
> Без указания character set кодировка по умолчанию UTF8.
> Это так и должно быть?

что показывает
SELECT RDB$CHARACTER_SET_NAME FROM RDB$DATABASE
?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939421
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

UTF8.

Осталось выяснить, кто и как создавал БД.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939426
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

а смысл? Чем utf-8 не устраивает?
Указание при подключении WIN1251 вполне себе позволяет работать с UTF-8 БД.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939428
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
для UTF8 не все кастомные collate применимы.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939429
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

версия ФБ какая? Мой склероз говорит, что в старых версиях ФБ был какой-то трабл с перекодировкой текстовых блоб, если в него были записаны данные, не соответствующие кодировке БД и коннекта.

А насчет вопроса - я не понял, в чем проблема-то. Дефолтная кодировка БД utf8, значит и у блоба такая кодировка, значит при коннекте в ютф8 не должно быть вообще никаких проблем.
Перекодировка происходит только если чарсет коннекта и чарсет столбца отличаются.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939432
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Дефолтная кодировка БД utf8

Ожидалось, что она должна быть WIN1251.
Ну, при применение collate см. выше.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939433
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая-то бессмысленная вьюха. Надо 1251 поднимай копнект в 1251 и читай, будет 1251. Надо утф, то то же самое и для него: поднимай коннект в утф и получишь утф. Если там фактически русские буквы, то проблем нет при любом сочетании чтение-хранение.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939436
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky
какая-то бессмысленная вьюха

Это просто для воспроизведения.

Ivan_Pisarevsky
Надо 1251 поднимай копнект в 1251 и читай, будет 1251

Не будет.

Пример:
В RDB$DATABASE RDB$CHARACTER_SET_NAME = 'UTF8'

Подключимся к БД с WIN1251 и создадим коллейт
Код: sql
1.
2.
3.
4.
create collation PXW_CYRL_CI_AI for WIN1251
   from PXW_CYRL
   CASE INSENSITIVE
   ACCENT INSENSITIVE;


Попытаемся выполнить запрос
Код: sql
1.
2.
select cast( 'qwerty' as blob sub_type text ) collate PXW_CYRL_CI_AI
  from RDB$DATABASE


Получаем
Код: powershell
1.
2.
3.
4.
5.
Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Data type unknown.
COLLATION PXW_CYRL_CI_AI for CHARACTER SET UTF8 is not defined.



P.S. Не указал - FB2.5.9
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939440
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovПодключимся к БД с WIN1251 и создадим коллейт

зачем? В UTF-8 есть вполне себе штатный коллейт UNICODE_CI_AI
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939442
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

и вообще зачем вам в блобах регистро нечувствительный коллейт? Что вы там такое с блобом делаете?
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939444
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
В UTF-8 есть вполне себе штатный коллейт UNICODE_CI_AI

В данном случае, тот, кто создавал базу, почему-то вместо WIN1251 указал кодировку UTF8. Видимо, ошибка.

А так да, можно (и нужно) использовать другой коллейт.

Получается, приведение к blob sub_type text не зависит от кодировки коннекта, а зависит от кодировки БД.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939448
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
зачем вам в блобах регистро нечувствительный коллейт?

Э-э-э... Даже не знаю, что на это ответить )
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939457
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20.03.2020 11:18, Polesov пишет:
>
> Получается, приведение к *blob sub_type text* не зависит от кодировки коннекта, а зависит от кодировки БД.

все СОЗДАВАЕМЫЕ поля, если для них не указывать кодировку явно,
имеют кодировку RDB$CHARACTER_SET_NAME из RDB$DATABASE,
независимо от того, с какой кодировкой ты приконнектился.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939463
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovПопытаемся выполнить запрос
бессмыслица. Коллэйт применим только к кодировке столбца. Указать коллейт от балды нельзя.
То есть, для столбца с кодировкой А можно указывать только те коллэйты, которые есть для кодировки А, но не для кодировки Б.
Впрочем, и созданный "регистронечувствительный коллейт" к win1251 - тоже бредятина. Откуда он возьмется? Его физически для win1251 не существует.

p.s. кстати, я понял - в исходном сообщении и описана вот та самая фигня, что автоматом блоб в кодировку коннекта не перекодируется.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939465
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сдается мне у автора в голове каша на предмет:
1. Как текстовые данные хранятся.
2. Как те же самые данные отдаются клиенту.

Внезапно, сервер вполне себе умеет совместимые кодировки друг в друга перекодировать.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939534
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий

все СОЗДАВАЕМЫЕ поля, если для них не указывать кодировку явно,
имеют кодировку RDB$CHARACTER_SET_NAME из RDB$DATABASE,
независимо от того, с какой кодировкой ты приконнектился.

Мне кажется, что литеральные значения составляют исключение.

В RDB$DATABASE UTF8, подключаемся с WIN1251
Код: sql
1.
2.
3.
4.
5.
6.
create view V (
    QUERTY)
as
select 'qwerty'
  from RDB$DATABASE
;


В данном случае QUERTY WIN1251;

Если подключиться с другим чарсетом, и создать аналогичную вью, то у поля будет чарсет подключения.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939536
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Впрочем, и созданный "регистронечувствительный коллейт" к win1251 - тоже бредятина.

От чего же бредятина? Коллейт создается штатными средствами.

kdv
та самая фигня, что автоматом блоб в кодировку коннекта не перекодируется.

+1
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939537
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky
Внезапно, сервер вполне себе умеет совместимые кодировки друг в друга перекодировать.

Только речь не про это.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939551
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovОт чего же бредятина? Коллейт создается штатными средствами.
от того, что таблица сортировки символов из воздуха не возьмётся. Например, как ДЕКЛАРАЦИЯ может обеспечить одинаковость поиска на "е" и "ё"? Каким образом движок узнает, что эти символы эквивалентны? Потому что кто-то написал CASE INSENSITIVE ACCENT INSENSITIVE; ???
Я уж не говорю о том, что код символа ё и его порядок в алфавите в utf8 и win1251 отличается.

p.s. как я понимаю, мы не спорим, что сортировку от одного чарсета нельзя пристегнуть к другому чарсету, так? :-)
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939555
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
как ДЕКЛАРАЦИЯ может обеспечить одинаковость поиска на "е" и "ё"?

Понятно, что "е" и "ё" не будут сравниваться одинаково,
но такой коллейт позволяет при сравнении игнорировать различия в регистре символов.
И при сортировке буква "ё" займет правильную позицию.

И, кстати, сравнение через регистронезависимый коллейт работает быстрее, чем сравнение upper( FIELD ) = upper( :VALUE )

kdv
p.s. как я понимаю, мы не спорим, что сортировку от одного чарсета нельзя пристегнуть к другому чарсету, так? :-)
Да, так. Хоть в чем-то консенсус )
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939568
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovно такой коллейт позволяет при сравнении игнорировать различия в регистре символов.
насколько мне известно, такой коллэйт один - и это UNICODE_CI_AI для UTF8. (я про равнозначность е, ё, Е, Ё).
Коллэйт, который игнорирует регистр букв, есть почти у всех кодировок, по умолчанию, тут создавать ничего не надо.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939590
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Polesovно такой коллейт позволяет при сравнении игнорировать различия в регистре символов.

Коллэйт, который игнорирует регистр букв, есть почти у всех кодировок, по умолчанию, тут создавать ничего не надо.
Посмотрим, какие коллейты по умолчанию есть для WIN1251:
Код: sql
1.
2.
3.
4.
select c.RDB$COLLATION_NAME
  from RDB$COLLATIONS c
  join RDB$CHARACTER_SETS s on ( s.RDB$CHARACTER_SET_ID = c.RDB$CHARACTER_SET_ID )
 where s.RDB$CHARACTER_SET_NAME = 'WIN1251'


Получаем три значения
WIN1251
PXW_CYRL
WIN1251_UA

Проверим эти коллейты
Код: sql
1.
2.
3.
select count(*)
  from RDB$DATABASE
 where 'UPPER' collate <COLLATE_NAME> = 'UppeR'


Для всех трех коллейтов запрос возвращает 0

Создадим коллейт
Код: sql
1.
2.
3.
4.
create collation PXW_CYRL_CI_AI for WIN1251
   from PXW_CYRL
   CASE INSENSITIVE
   ACCENT INSENSITIVE;



Запрос
Код: sql
1.
2.
3.
select count(*)
  from RDB$DATABASE
 where 'UPPER' collate PXW_CYRL_CI_AI = 'UppeR'


возвращает 1

Ы-ы-ы?
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939692
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

здесь видимо, срабатывает только CASE INSENSITIVE.
А вот так
Код: sql
1.
2.
3.
select count(*)
  from RDB$DATABASE
 where 'UPPER' collate PXW_CYRL = 'UppeR'


оно, по идее, и не должно давать результат. Потому что коллэйт сам по себе не переводит строку в upper. Он влияет разве что на сортировку. И, видимо, исходно PXW_CYRL не case insensitive.

Polesovwhere 'UPPER' collate PXW_CYRL_CI_AI = 'UppeR'
возвращает 1
тут ошибка в том, что вы в имени нового коллэйта указываете И CI И AI, но проверив только на CI, крайне радуетесь.
При этом, работает-ли AI, вы не проверяете. Называть коллэйт надо было типа PXW_CYRL_TEST, а потом уже, после всех проверок, радоваться что движок обеспечивает и CI и AI, или не радоваться, если он что-то не обеспечивает.
См. http://www.ibase.ru/unicode_faq/
"Какие есть сортировки (collate) для UTF8?"
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939695
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovДля всех трех коллейтов запрос возвращает 0
http://www.ibase.ru/files/firebird/langref25rus/index.html#systables-collations

RDB$COLLATION_ATTRIBUTES SMALLINT Атрибуты сортировки. Представляет собой битовую маску, где 1-й бит показывает учитывать ли конечные пробелы при сравнении (0 — NO PAD; 1 — PAD SPACE); 2-й бит показывает является ли сравнение чувствительным к регистру символов (0 — CASE SENSITIVE, 1 — CASE INSENSITIVE); 3-й бит показывает будет ли сравнение чувствительным к акцентам (0 — ACCENT SENSITIVE, 1 — ACCENT SENSITIVE). Таким образом, значение 5 означает, что сравнение не является чувствительным к конечным пробелам и к акцентированным буквам.

у PXW_CYRL атрибуты = 1.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Литеральный блоб - кодировка character set UTF8
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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