powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UTF база, автоматический размер для COMPUTED BY поля
13 сообщений из 13, страница 1 из 1
UTF база, автоматический размер для COMPUTED BY поля
    #39034709
FedorinoFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Столкнулся с некой проблемой. В смежных темах уже что-то проскакивало, но темы довольно старые и как обстоят дела именно сейчас. С учетом потенциально новых тенденций?
Суть такова: База UTF8, и простая таблица:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE GUEST (
  LAST_NAME                  VARCHAR(100),
  FIRST_NAME                 VARCHAR(100),
  MIDDLE_NAME                VARCHAR(100),
  FIO VARCHAR(110) COMPUTED BY (
    LAST_NAME ||
              COALESCE(' ' || SUBSTRING(NULLIF(TRIM(FIRST_NAME), '') FROM 1 FOR 1) || '.', '') ||
              COALESCE(' ' || SUBSTRING(NULLIF(TRIM(MIDDLE_NAME), '') FROM 1 FOR 1) || '.', '')),
  FIO1 COMPUTED BY (LAST_NAME || FIRST_NAME || MIDDLE_NAME)
  );




Для поля FIO явно указан домен (если домен не указывать, то автогенерится размер VARCHAR(1216))
Для поля FIO1 FB генерит размер VARCHAR(1200).

На мой взгляд, явная ошибка в вычислениях (предполагаю, что размер строки умножается на 4).
Но ведь VARCHAR(100) это 100 code-point, в совсем грубом приближении, это 100 символов. а уж сколько байт надо выделить под эти символы - совсем другая история.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034715
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FedorinoFF,

как проверял размер? На какой версии сервера? Что будет если вместо вычисляемого поля проверить размер в запросе или вьюхе?
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034733
FedorinoFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Да, виноват, не написал.
Проверял через IBExpert (как проверить через ISQL не нашел)
Сервер WI-V6.3.3.26780 Firebird 2.5

Если сделать через запрос, то размер калькулироемого поля VARCHAR(304).
В запросе из VIEW - VARCHAR(304).
В описании структуры (вкладка Fields) VIEW - VARCHAR(1216).

Похоже IBExpert подвирает. но если можно еще как-то проверить - подскажите как.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034746
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FedorinoFFПохоже IBExpert подвирает. но если можно еще как-то проверить - подскажите как.

В RDB$FIELDS найти домен этого поля и посмотреть. Но это эксперт врет.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034749
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько помню, rdb$character_length сервером не заполняется в данном случае. При этом главное (rdb$field_length) заполнено правильно, поэтому на скорость не влияет все работает как ожидается. Т.е. проблема исключительно в визуализации метаданных и их выгрузке.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034753
FedorinoFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

Докладываю. через isql создал поле . пошел в системные таблицы и обнаружил там VARCHAR(1216).
запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
  R.RDB$RELATION_NAME,
  RF.RDB$FIELD_NAME,
  F.RDB$FIELD_NAME as FIELD_DOMAIN,
  F.RDB$FIELD_LENGTH
FROM
  RDB$RELATIONS R
JOIN RDB$RELATION_FIELDS RF ON RF.RDB$RELATION_NAME = R.RDB$RELATION_NAME and RF.RDB$FIELD_NAME = 'FIO'
JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
WHERE
  R.RDB$RELATION_NAME = 'STAFF'




Сюжет все более запутывается.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034761
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FedorinoFFДокладываю. через isql создал поле . пошел в системные таблицы и обнаружил там VARCHAR(1216).


RDB$FIELD_LENGTH - это длина в байтах, она и должна быть 1216.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034765
FedorinoFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FedorinoFF,

На самом деле, все интересно.
Если создать поле с явным указанием типа, то
RDB$FIELDS.RDB$FIELD_LENGTH = 440,
RDB$FIELDS.RDB$CHARACTER_LENGTH = 110
все честно.

НО!, если не указывать тип поля при создании (FIO1), то получаем
RDB$FIELDS.RDB$FIELD_LENGTH = 1216,
RDB$FIELDS.RDB$CHARACTER_LENGTH = 0

И вот тут и есть проблема, ИМХО, которая начинает путать всех.

два поля
Код: 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.
25.
26.
ALTER TABLE STAFF
ADD FIO VARCHAR(110) COMPUTED BY (
    LAST_NAME ||
              COALESCE(' ' || SUBSTRING(NULLIF(TRIM(FIRST_NAME), '') FROM 1 FOR 1) || '.', '') ||
              COALESCE(' ' || SUBSTRING(NULLIF(TRIM(MIDDLE_NAME), '') FROM 1 FOR 1) || '.', ''));


ALTER TABLE STAFF
ADD FIO1 COMPUTED BY (
    LAST_NAME ||
              COALESCE(' ' || SUBSTRING(NULLIF(TRIM(FIRST_NAME), '') FROM 1 FOR 1) || '.', '') ||
              COALESCE(' ' || SUBSTRING(NULLIF(TRIM(MIDDLE_NAME), '') FROM 1 FOR 1) || '.', ''));

SELECT
  R.RDB$RELATION_NAME,
  RF.RDB$FIELD_NAME,
  F.RDB$FIELD_NAME AS FIELD_DOMAIN,
  F.RDB$FIELD_LENGTH,
  F.RDB$CHARACTER_LENGTH
FROM
  RDB$RELATIONS R
JOIN RDB$RELATION_FIELDS RF ON RF.RDB$RELATION_NAME = R.RDB$RELATION_NAME AND
      RF.RDB$FIELD_NAME LIKE 'FIO%'
JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
WHERE
  R.RDB$RELATION_NAME = 'STAFF'   


...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034771
FedorinoFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertFedorinoFFДокладываю. через isql создал поле . пошел в системные таблицы и обнаружил там VARCHAR(1216).


RDB$FIELD_LENGTH - это длина в байтах, она и должна быть 1216.
да, уже понял.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034780
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FedorinoFFИ вот тут и есть проблема, ИМХО, которая начинает путать всех
этот баян есть в трекере
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034807
FedorinoFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrFedorinoFFИ вот тут и есть проблема, ИМХО, которая начинает путать всех
этот баян есть в трекере
Да, нашел, похоже вот этот вариант Bug with COMPUTED BY fields
Но потом решил, что так задумано, чтоб отличать автоматическое вычисление типа от явно заданного.
А при всяких отображениях в менеджерах, типа IBExpert, этот факт нужно учитывать.
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034832
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FedorinoFF,

попробовал через isql. Но там тоже выводится в байтах

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> set sqlda_display on;
SQL>   select * from guest;

INPUT message field count: 0

OUTPUT message field count: 5
01: sqltype: 448 VARYING Nullable scale: 0 subtype: 0 len: 400 charset: 4 UTF8
  :  name: LAST_NAME  alias: LAST_NAME
  : table: GUEST  owner: SYSDBA
02: sqltype: 448 VARYING Nullable scale: 0 subtype: 0 len: 400 charset: 4 UTF8
  :  name: FIRST_NAME  alias: FIRST_NAME
  : table: GUEST  owner: SYSDBA
03: sqltype: 448 VARYING Nullable scale: 0 subtype: 0 len: 400 charset: 4 UTF8
  :  name: MIDDLE_NAME  alias: MIDDLE_NAME
  : table: GUEST  owner: SYSDBA
04: sqltype: 448 VARYING Nullable scale: 0 subtype: 0 len: 440 charset: 4 UTF8
  :  name: FIO  alias: FIO
  : table: GUEST  owner: SYSDBA
05: sqltype: 448 VARYING Nullable scale: 0 subtype: 0 len: 1200 charset: 4 UTF8
  :  name: FIO1  alias: FIO1
  : table: GUEST  owner: SYSDBA
SQL>

P.S. dimitr,
а можно в help set добавить справку о sqlda_display, а также вывод о его текущем значении в команде set?
...
Рейтинг: 0 / 0
UTF база, автоматический размер для COMPUTED BY поля
    #39034957
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениса можно в help set добавить справку о sqlda_display, а также вывод о его текущем значении в команде set?
оно сознательно недокументировано. Раньше это была фича только для разработчиков сервера и компилировалась только для дебаг-билдов. Потом ее открыли и для продакшен-билдов, но все равно это слишком низкоуровневая штука для рядового юзера. К тому же вывод может плавать от версии к версии, в тройке там вообще много поменялось.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UTF база, автоматический размер для COMPUTED BY поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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