powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с UNICODE_FSS
25 сообщений из 39, страница 1 из 2
Помогите с UNICODE_FSS
    #39188606
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

FB 2.5.2.26540. Есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE PROPS_TXT (
    PTX_ID       BIGINT NOT NULL,
    PTX_ID_OBJ   BIGINT NOT NULL,
    PTX_ID_LANG  BIGINT NOT NULL,
    PTX_PROP     VARCHAR(48) NOT NULL,
    PTX_VALUE    VARCHAR(8192) CHARACTER SET UNICODE_FSS
);

В соединении IBExpert выставлен Charset UNICODE_FSS , Font Characters Set RUSSIAN_CHARSET .

Есть хранимая процедура, которая должна собирать значения в одну строку через разделитель.
Полный текст процедуры не привожу, т.к. в "сокращенном" варианте та же ошибка.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE OR ALTER PROCEDURE GET_TOVAR_NAME_NEW_2
returns (
    yname varchar(8192) character set unicode_fss
    )
as
declare variable i integer;
declare variable s varchar(8192) character set unicode_fss;
begin
  i = 0;
  while (i <= 5) do
  begin
    s = null;
    select first 1 lower(pr.ptx_value)
    from extra_values_ref r
    left join extra_props ep on ep.ep_id = r.ref_ep
    left join props_txt pr on pr.ptx_id_obj = r.ref_ev and pr.ptx_id_lang = 27004 and pr.ptx_prop = 'EV_NAME'
    where r.ref_obj1 = -257962846 and ep.ep_order = :i and ep.ep_obj is not null
    into :s;
    yname = :s;  -- вот тут ошибка
    end
    i = i + 1;
  end
  suspend;
end


На некоторых значениях (в частности plokštos siūles) присвоение сваливается с ошибкой
Код: sql
1.
2.
arithmetic exception, numeric overflow, or string truncation.
Cannot transliterate character between character sets.



В чем может быть дело и как эту ошибку победить?

Запрос с list работает корректно, но в нем нет возможности использовать order by, потому он не подходит.
Код: sql
1.
2.
3.
4.
5.
select list( lower(pr.ptx_value), ', ' )
    from extra_values_ref r
    left join extra_props ep on ep.ep_id = r.ref_ep
    left join props_txt pr on pr.ptx_id_obj = r.ref_ev and pr.ptx_id_lang = 27004 and pr.ptx_prop = 'EV_NAME'
    where r.ref_obj1 = -257962846 and ep.ep_obj is not null
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188613
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

1. Зачем использовать устаревший чарсет?
2. попробуй обновится до 2.5.5 ибо CORE-4566 , хотя не уверен что это тот случай
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188619
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

на что менять? UTF8 ?
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188623
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

да. UNICODE_FSS сейчас только в метаданных.
Но для начала проверь на последнем снапшоте.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188624
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

спасибо, попробую.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188772
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

к сожалению, не помогло. Либо я что-то делаю не так.

1. Поставил Firebird-2.5.5.26952.

2. В таблицу добавил поле, получил такую структуру
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE PROPS_TXT (
    PTX_ID         BIGINT NOT NULL,
    PTX_ID_OBJ     BIGINT NOT NULL,
    PTX_ID_LANG    BIGINT NOT NULL,
    PTX_PROP       VARCHAR(48) NOT NULL,
    PTX_VALUE      VARCHAR(8192) CHARACTER SET UNICODE_FSS,
    PTX_VALUE_UTF  VARCHAR(4096) CHARACTER SET UTF8
);


3. Выполнил
Код: sql
1.
update props_txt t set t.ptx_value_utf = t.ptx_value


4. В процедуре пробовал использовать PTX_VALUE_UTF - результат тот же:
Код: sql
1.
2.
arithmetic exception, numeric overflow, or string truncation.
Cannot transliterate character between character sets.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188780
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

а что же ты под UTF8 в два раза меньше места выделил 4096 vs 8192?
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188783
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

в процедуре тоже чарсет поменял у всех переменных?
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188789
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

потому при выполнении
Код: sql
1.
ALTER TABLE PROPS_TXT ADD PTX_VALUE_UTF VARCHAR(8192) CHARACTER SET UTF8 COLLATE UTF8


получил ошибку
Код: sql
1.
Implementation limit exceeded.


Да и длина того "проблемного" значения меньше 4096. Не думаю, что в длине дело.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188792
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

чарсет коннекта тот же что и был?
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188796
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

да, коннект UTF8.

Процедура выглядит так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE OR ALTER PROCEDURE GET_TOVAR_NAME_NEW_2
returns (
    yname varchar(8191) character set utf8
    )
as
declare variable i integer;
declare variable s varchar(8191) character set utf8;
begin
  i = 0;
  while (i <= 5) do
  begin
    s = null;
    select first 1 lower(pr.ptx_value_utf)
    from extra_values_ref r
    left join extra_props ep on ep.ep_id = r.ref_ep
    left join props_txt pr on pr.ptx_id_obj = r.ref_ev and pr.ptx_id_lang = 27004 and pr.ptx_prop = 'EV_NAME'
    where r.ref_obj1 = -257962846 and ep.ep_order = :i and ep.ep_obj is not null
    into :s;
    yname = :s;
    end
    i = i + 1;
  end
  suspend;
end
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188802
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

делай минимально воспроизводимый пример и в трекер
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188806
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

где можно подсмотреть шаблон запроса в трекер?
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188810
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

в трекере вестимо. Посмотри как другие тикеты оформлены
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188888
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

http://www.ibase.ru/unicode_faq/

вероятно, не работает конвертация из unicode_fss в utf8. Тогда действительно в трекер.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188898
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разместил CORE-5145
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188902
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

на будущее - наименование core надо оформлять так, чтобы было ясно, в чем проблема (или область проблемы). В твоем случае оно должно было быть, например
"from UNICODE_FSS to UTF8: Cannot transliterate character between character sets".
или
"Can not convert data from UNICODE_FSS to UTF8".
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188903
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

а сама БД в каком чарсете создана?
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188908
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

на мой взгляд, тут не совсем конвертация. Коннект UTF8, поле в таблице UTF8, переменные тоже UTF8. Причем до брейкпойнта на присвоении видно, что в S находится правильный текст. Тем не менее, если такой заголовок не совсем очевидный, то подскажи, на что исправить, чтоб было понятнее.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188913
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

БД в WIN1251.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188931
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

что-то я уже запутался. вначале не копировался unicode_fss в unicode_fss. Потом не копировался unicode_fss в utf8. В результате в трекер попал багрепорт что не копируется utf8 в utf8. Причем, в самом багрепорте тоже баг, потому что в пункте 2 (insert) есть столбец PTX_VALUE, а больше его нигде нет - ни в таблице, ни в запросе.

Я создал таблицу в базе utf8, вставил данные (воткнул русские буквы), создал процедуру - при выборке из процедуры НИКАКИХ ошибок нет.

А вот если я в IBE в редакторе данных пытаюсь в столбце PTX_VALUE_UTF поменять русские буквы на 'plokštos siūles', то вылазит ошибка
Implementation limit exceeded.
block size exceeds implementation restriction.

удалил запись, вставил с текстом plokštos siūles, выполняю селект из процедуры - ошибок нет.

Вопросы
1. почему у меня на фб 2.5.5 тест-кейз работает НЕ ТАК (т.е. ошибок не выдает).
2. почему при update с русских букв на другие возникает implementation limit exceeded

вероятно п.2 связан с IBExpert, т.к.
Код: sql
1.
2.
3.
update props_txt_2 p
set p.ptx_value_utf= 'plok&#353;tos si&#363;les'
where p.ptx_id =970952385001



проходит. Следом
Код: sql
1.
2.
3.
update props_txt_2 p
set p.ptx_value_utf= 'ёпрст'
where p.ptx_id =970952385001


тоже проходит.
И

обратно (первый update) тоже проходит.

Похоже, что Firebird тут как-то ни при чем.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188937
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MarcelloБД в WIN1251.
нет такого понятия.
есть чарсет коннекта и чарсет столбца. "Чарсет БД" - это тот чарсет, который будет использован у строковых столбцов или переменных при создании таблиц, процедур и триггеров, если никакой другой чарсет при этом указан не был.
Так что "чарсет БД" это типа "шаблон чарсета для столбцов и переменных, создаваемых без указания чарсета".

p.s. за последние 10 дней я вроде бы это уже второй раз объясняю.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188960
Marcello
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

сейчас в той таблице одна строка, которая с Plokštos siūles. В IBExpert пишу в поле (через встроенный редактор) "ёпрст" - ошибка "Implementation limit exceeded".

Если делаю через стейтмент
Код: sql
1.
update props_txt_2 t set t.ptx_value_utf = 'ёпрст'

, то все ок, ошибки нет.

Похоже дело не FB.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188962
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Marcello,

короче, implementation limit exceeded возникает в IBExpert когда с одних символов на другие меняешь запись прямо "в таблице", и у таблицы нет ПК.

Код: sql
1.
2.
3.
update PROPS_TXT_2 set 
PTX_VALUE_UTF = ?PTX_VALUE_UTF
WHERE (PTX_ID = ?"$OLD_PTX_ID") AND (PTX_ID_OBJ = ?"$OLD_PTX_ID_OBJ") AND (PTX_ID_LANG = ?"$OLD_PTX_ID_LANG") AND (PTX_PROP = ?"$OLD_PTX_PROP") AND (PTX_VALUE_UTF = ?"$OLD_PTX_VALUE_UTF")



облом.

Создаем ПК для таблицы

Код: sql
1.
2.
alter table props_txt_2 add constraint pk_props_txt_2
primary key (ptx_id)



пытаемся поменять еще раз - проходит. как я уже писал выше, просто update в sql editor и так проходил без проблем.
...
Рейтинг: 0 / 0
Помогите с UNICODE_FSS
    #39188996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvimplementation limit exceeded возникает в IBExpert
Вот именно поэтому тесткейсы всегда надо создавать для isql.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с UNICODE_FSS
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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