Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Литеральный блоб - кодировка character set UTF8 / 25 сообщений из 33, страница 1 из 2
20.03.2020, 10:38
    #39939409
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
Привет всем.

Создание базы и подключение 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
20.03.2020, 10:41
    #39939414
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
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
20.03.2020, 10:52
    #39939421
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
Мимопроходящий,

UTF8.

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

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

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

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

Ожидалось, что она должна быть WIN1251.
Ну, при применение collate см. выше.
...
Рейтинг: 0 / 0
20.03.2020, 11:00
    #39939433
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
какая-то бессмысленная вьюха. Надо 1251 поднимай копнект в 1251 и читай, будет 1251. Надо утф, то то же самое и для него: поднимай коннект в утф и получишь утф. Если там фактически русские буквы, то проблем нет при любом сочетании чтение-хранение.
...
Рейтинг: 0 / 0
20.03.2020, 11:07
    #39939436
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
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
20.03.2020, 11:14
    #39939440
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
PolesovПодключимся к БД с WIN1251 и создадим коллейт

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

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

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

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

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

Э-э-э... Даже не знаю, что на это ответить )
...
Рейтинг: 0 / 0
20.03.2020, 11:34
    #39939457
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
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
20.03.2020, 11:49
    #39939463
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
PolesovПопытаемся выполнить запрос
бессмыслица. Коллэйт применим только к кодировке столбца. Указать коллейт от балды нельзя.
То есть, для столбца с кодировкой А можно указывать только те коллэйты, которые есть для кодировки А, но не для кодировки Б.
Впрочем, и созданный "регистронечувствительный коллейт" к win1251 - тоже бредятина. Откуда он возьмется? Его физически для win1251 не существует.

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

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

все СОЗДАВАЕМЫЕ поля, если для них не указывать кодировку явно,
имеют кодировку 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
20.03.2020, 14:06
    #39939536
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
kdv
Впрочем, и созданный "регистронечувствительный коллейт" к win1251 - тоже бредятина.

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

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

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

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

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

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

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

kdv
p.s. как я понимаю, мы не спорим, что сортировку от одного чарсета нельзя пристегнуть к другому чарсету, так? :-)
Да, так. Хоть в чем-то консенсус )
...
Рейтинг: 0 / 0
20.03.2020, 14:53
    #39939568
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
Polesovно такой коллейт позволяет при сравнении игнорировать различия в регистре символов.
насколько мне известно, такой коллэйт один - и это UNICODE_CI_AI для UTF8. (я про равнозначность е, ё, Е, Ё).
Коллэйт, который игнорирует регистр букв, есть почти у всех кодировок, по умолчанию, тут создавать ничего не надо.
...
Рейтинг: 0 / 0
20.03.2020, 15:16
    #39939590
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
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
20.03.2020, 19:30
    #39939692
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
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
20.03.2020, 19:37
    #39939695
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Литеральный блоб - кодировка character set UTF8
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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Литеральный блоб - кодировка character set UTF8 / 25 сообщений из 33, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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