powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Литеральный блоб - кодировка character set UTF8
33 сообщений из 33, показаны все 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
Литеральный блоб - кодировка character set UTF8
    #39939811
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect debug user SYSDBA password masterkey;
Database:  debug, User: SYSDBA
SQL> select RDB$COLLATION_NAME,
CON>        RDB$COLLATION_ATTRIBUTES
CON>   from RDB$COLLATIONS
CON>  where RDB$COLLATION_NAME in ( 'UNICODE_CI_AI', 'PXW_CYRL_CI_AI' );

RDB$COLLATION_NAME     RDB$COLLATION_ATTRIBUTES
=====================  ========================
UNICODE_CI_AI                                 7
PXW_CYRL_CI_AI                                7

SQL>


Но для PXW_CYRL_CI_AI ACCENT INSENSITIVE почему-то не работает.
Для UNICODE_CI_AI все нормально.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939839
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

я ведь уже говорил, что ДЕКЛАРАЦИЯ к реализации имеет мало отношения. В столбце RDB$COLLATION_ATTRIBUTES - битовая маска декларации.
Для PXW_CYRL она базовая, системная.
Для вашей декларации - да, будет такая, как задекларируете, но вопрос - ЧЕМ обеспечивается accent insensitive.
PolesovДля UNICODE_CI_AI все нормально.
так оно сделано, а не просто задекларировано.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39939866
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
так оно сделано, а не просто задекларировано.

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

kdv

Polesovwhere 'UPPER' collate PXW_CYRL_CI_AI = 'UppeR'
возвращает 1

тут ошибка в том, что вы в имени нового коллэйта указываете и CI И AI, но проверив только на CI, крайне радуетесь.
При этом, работает-ли AI, вы не проверяете.

По идее, в этом случае для коллэйта достатчно было указать только " case insensitive ".
Но оказалось, что " case insensitive " без " accent insensitive " не работает.

Создадим два коллэйта и таблицу с их использованием:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create collation PXW_CYRL_CI for WIN1251
  from PXW_CYRL
  case insensitive;

create collation PXW_CYRL_CI_AI for WIN1251
  from PXW_CYRL
  case insensitive
accent insensitive;

create table T (
    CI     varchar(10) collate PXW_CYRL_CI,
    CI_AI  varchar(10) collate PXW_CYRL_CI_AI
);

insert into T (
    CI,
    CI_AI )
values (
    'zZяЯёЁ',
    'zZяЯёЁ' );
commit;



В запросе по коллэйту без " accent insensitive " условие по " case insensitive " не выполняется.
Код: sql
1.
2.
3.
4.
5.
6.
7.
select count(*)  -- возвращает 0
  from T
 where CI = 'ZZЯЯЁЁ';

select count(*)  -- возвращает 1
  from T
 where CI_AI = 'ZZЯЯЁЁ';
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39948616
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

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

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

я уже говорил, что чарсеты в сервере это не бесконечный конструктор. И полёт вашей мысли для меня недоступен. У чарсета какой-то коллэйт либо есть, либо нет. А то, что декларация позволяет определить коллэйт, которого нет (или не работает) - это, как бы, фича такая.
...
Рейтинг: 0 / 0
Литеральный блоб - кодировка character set UTF8
    #39948703
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
в данном случае рассматривается создание регистронезависимого коллейта (без "accent insensitive").
Для этого, согласно документации, достаточно указания "case insensitive".
Но "case insensitive" без указания "accent insensitive" не работает.
Вот что по этому поводу сказал hvlad 8873774 .
Но для Вас, видимо, "полет моей мысли" недоступен.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Литеральный блоб - кодировка character set UTF8
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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