Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UTF база, автоматический размер для COMPUTED BY поля / 13 сообщений из 13, страница 1 из 1
24.08.2015, 09:18
    #39034709
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
Здравствуйте!

Столкнулся с некой проблемой. В смежных темах уже что-то проскакивало, но темы довольно старые и как обстоят дела именно сейчас. С учетом потенциально новых тенденций?
Суть такова: База 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
24.08.2015, 09:38
    #39034715
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
FedorinoFF,

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

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

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

В RDB$FIELDS найти домен этого поля и посмотреть. Но это эксперт врет.
...
Рейтинг: 0 / 0
24.08.2015, 10:34
    #39034749
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
насколько помню, rdb$character_length сервером не заполняется в данном случае. При этом главное (rdb$field_length) заполнено правильно, поэтому на скорость не влияет все работает как ожидается. Т.е. проблема исключительно в визуализации метаданных и их выгрузке.
...
Рейтинг: 0 / 0
24.08.2015, 10:38
    #39034753
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
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
24.08.2015, 10:47
    #39034761
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
FedorinoFFДокладываю. через isql создал поле . пошел в системные таблицы и обнаружил там VARCHAR(1216).


RDB$FIELD_LENGTH - это длина в байтах, она и должна быть 1216.
...
Рейтинг: 0 / 0
24.08.2015, 10:50
    #39034765
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
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
24.08.2015, 10:53
    #39034771
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
IBExpertFedorinoFFДокладываю. через isql создал поле . пошел в системные таблицы и обнаружил там VARCHAR(1216).


RDB$FIELD_LENGTH - это длина в байтах, она и должна быть 1216.
да, уже понял.
...
Рейтинг: 0 / 0
24.08.2015, 10:58
    #39034780
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
FedorinoFFИ вот тут и есть проблема, ИМХО, которая начинает путать всех
этот баян есть в трекере
...
Рейтинг: 0 / 0
24.08.2015, 11:20
    #39034807
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
dimitrFedorinoFFИ вот тут и есть проблема, ИМХО, которая начинает путать всех
этот баян есть в трекере
Да, нашел, похоже вот этот вариант Bug with COMPUTED BY fields
Но потом решил, что так задумано, чтоб отличать автоматическое вычисление типа от явно заданного.
А при всяких отображениях в менеджерах, типа IBExpert, этот факт нужно учитывать.
...
Рейтинг: 0 / 0
24.08.2015, 11:46
    #39034832
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
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
24.08.2015, 14:01
    #39034957
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UTF база, автоматический размер для COMPUTED BY поля
Симонов Дениса можно в help set добавить справку о sqlda_display, а также вывод о его текущем значении в команде set?
оно сознательно недокументировано. Раньше это была фича только для разработчиков сервера и компилировалась только для дебаг-билдов. Потом ее открыли и для продакшен-билдов, но все равно это слишком низкоуровневая штука для рядового юзера. К тому же вывод может плавать от версии к версии, в тройке там вообще много поменялось.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UTF база, автоматический размер для COMPUTED BY поля / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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