SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » alter table похоже на баг (алтер поля в таблице игнорирует чарсет)
alter table похоже на баг [сообщение #5791] Thu, 05 December 2024 18:52 Переход к следующему сообщению
protector в настоящее время не в онлайне  protector
Сообщений: 7
Зарегистрирован: May 2023
Junior Member

Например имеем в таблице T поле F типа int. Впрочем исходный тип совершенно не важен.
Если сделать алтер этому полю.
  alter table T
  alter C type varchar(50)
То мы получаем поле varchar(50) с чарсетом NONE. Причем это не зависит ни от дефолтной кодировки базы, ни от кодировки подключения.
И даже если так сделать:
alter table T
  alter C type varchar(50) character set UTF8
То всё равно получаем поле в кодировке NONE.
Хотя если добавлять поле вместо альтера, то кодировка воспринимается корректно
FB 4 и 5 на других не проверял.

[Обновления: Thu, 05 December 2024 18:52]

Известить модератора

Re: alter table похоже на баг [сообщение #5792 является ответом на сообщение #5791] Fri, 06 December 2024 01:52 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
SQL> create database "test" default character set utf8;
SQL> create table t (c integer);
SQL> commit;
SQL> show table t;
C                               INTEGER Nullable
SQL> alter table t alter c type varchar(50) character set win1251;
SQL> commit;
SQL> show table t;
C                               VARCHAR(50) CHARACTER SET WIN1251 Nullable
SQL> show version;
ISQL Version: WI-T6.0.0.544 Firebird 6.0 9694399
Server version:
Firebird/Windows/AMD/Intel/x64 (access method), version "WI-T6.0.0.544 Firebird 6.0 9694399"
on disk structure version 14.0
ЧЯДНТ?
Re: alter table похоже на баг [сообщение #5793 является ответом на сообщение #5792] Fri, 06 December 2024 12:09 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Не пробовал воспроизвести то что у автора написано.

Дима, ты используешь 6.0, в который ты сам же копался по поводу charset/collate. Вроде даже что-то сделал чтобы коллате можно было через ALTER менять.
Перепроверь на 5.0
Re: alter table похоже на баг [сообщение #5794 является ответом на сообщение #5793] Fri, 06 December 2024 15:26 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
Да, на пятёрке воспроизвелось. Но, поскольку, как ты сам сказал, я копался в этом месте шестёрки - на пятёрку мне уже всё равно.

Да и если бы мне взбрела в голову блажь исправить этот баг - ТС-у это не поможет, поскольку мои патчи даже в нестабильную ветку не рассматриваются годами, а в стабильную их и подавно никто не пустит.

Пусть этим Влад занимается.
Re: alter table похоже на баг [сообщение #5795 является ответом на сообщение #5794] Fri, 06 December 2024 21:20 Переход к предыдущему сообщениюПереход к следующему сообщению
avp в настоящее время не в онлайне  avp
Сообщений: 83
Зарегистрирован: October 2023
Member
Вопрос по теме.
Как быстро всем полям в базе в кодировке NONE присвоить кодировку win1251 ?
Re: alter table похоже на баг [сообщение #5796 является ответом на сообщение #5795] Fri, 06 December 2024 22:05 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Никак.
Во-первых нет никакой гарантии что в поле none ранее были записаны символы в правильной кодировке.
Во-вторых это придется отдельно менять кодировку для каждого столбца. Причем нет никакой гарантии что при изменении типа все будет хорошо. Потому что смотри выше, косяки с этим есть. Надежный способ только пересоздание БД из скрипта с новыми чарсетами и переливка данных data pump.
Re: alter table похоже на баг [сообщение #5797 является ответом на сообщение #5796] Fri, 06 December 2024 22:39 Переход к предыдущему сообщениюПереход к следующему сообщению
avp в настоящее время не в онлайне  avp
Сообщений: 83
Зарегистрирован: October 2023
Member
1. гарантия в целом есть
2. разве в win1251 есть проверки на допустимые символы?
Re: alter table похоже на баг [сообщение #5799 является ответом на сообщение #5797] Sun, 08 December 2024 16:58 Переход к предыдущему сообщениюПереход к следующему сообщению
protector в настоящее время не в онлайне  protector
Сообщений: 7
Зарегистрирован: May 2023
Junior Member

Цитата:

Вопрос по теме.
Как быстро всем полям в базе в кодировке NONE присвоить кодировку win1251 ?
Если поля не задействованы в индексах то можно так. Иначе нужно дропнуть индексы констрэйнты, потом создать.
execute block as
declare variable N type of column RDB$FIELDS.rdb$field_name;
declare variable l int;
begin
  for
   select F.rdb$field_name, F.rdb$character_length/*, RF.rdb$relation_name, RF.rdb$field_name */ from RDB$FIELDS F
      join rdb$relation_fields RF on RF.rdb$field_source = F.rdb$field_name
      join rdb$relations R on R.rdb$relation_name = RF.rdb$relation_name
      where F.rdb$system_flag = 0 and
            F.rdb$field_type in (37,38) and
            F.rdb$character_set_id = 0 and
            R.rdb$relation_type = 0 and
            F.rdb$field_name starting with 'RDB$'
      into :N, :L
  do
    execute statement 'alter domain '||:N||' type varchar('||:L||') character set win1251';
end
Re: alter table похоже на баг [сообщение #5801 является ответом на сообщение #5799] Mon, 09 December 2024 09:09 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 166
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
protector писал(а) Sun, 08 December 2024 21:58
      where F.rdb$system_flag = 0 and
Лучше
      where F.rdb$system_flag <> 1 and
Re: alter table похоже на баг [сообщение #5802 является ответом на сообщение #5801] Mon, 09 December 2024 12:12 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
basid писал(а) Mon, 09 December 2024 09:09
protector писал(а) Sun, 08 December 2024 21:58
      where F.rdb$system_flag = 0 and
Лучше
      where F.rdb$system_flag <> 1 and
нет.
NULL-ы давно изжили, да и не сработало бы оно, буде таковые присутствовали бы.
Re: alter table похоже на баг [сообщение #5803 является ответом на сообщение #5802] Mon, 09 December 2024 17:43 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 166
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Senior Member
А должно было бы сработать. Поэтому категорическое "нет" - несколько излишне категорично.
Re: alter table похоже на баг [сообщение #5804 является ответом на сообщение #5799] Mon, 09 December 2024 21:02 Переход к предыдущему сообщениюПереход к следующему сообщению
avp в настоящее время не в онлайне  avp
Сообщений: 83
Зарегистрирован: October 2023
Member
Спасибо. Ещё хотелось бы понять версию FB начиная с которой этот оператор поддерживается:
alter domain '||:N||' type varchar('||:L||') character set win1251

[Обновления: Mon, 09 December 2024 21:03]

Известить модератора

Re: alter table похоже на баг [сообщение #5806 является ответом на сообщение #5804] Tue, 10 December 2024 04:09 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 140
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
avp писал(а) Tue, 10 December 2024 01:02
Спасибо. Ещё хотелось бы понять версию FB начиная с которой этот оператор поддерживается:
alter domain '||:N||' type varchar('||:L||') character set win1251
В доке по 2.5 написано:


ALTER DOMAIN name
 [{TO new_name}]
 [{SET DEFAULT {literal | NULL | <context_var>} |
   DROP DEFAULT}]
 [{ADD [CONSTRAINT] CHECK (<dom_condition>) |
   DROP CONSTRAINT}]
 [{TYPE <datatype>}];

<datatype> ::=
   {SMALLINT | INT[EGER] | BIGINT} [<array_dim>]
 | {FLOAT | DOUBLE PRECISION} [<array_dim>]
 | {DATE | TIME | TIMESTAMP} [<array_dim>]
 | {DECIMAL | NUMERIC} [(precision [, scale])] [<array_dim>]
 | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
   [<array_dim>] [CHARACTER SET charset_name]
 | {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING]
   [(size)] [<array_dim>]
 | BLOB [SUB_TYPE {subtype_num | subtype_name}]
   [SEGMENT SIZE seglen] [CHARACTER SET charset_name]
 | BLOB [(seglen [, subtype_num])]

Re: alter table похоже на баг [сообщение #5808 является ответом на сообщение #5803] Tue, 10 December 2024 16:14 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
basid писал(а) Mon, 09 December 2024 17:43
А должно было бы сработать. Поэтому категорическое "нет" - несколько излишне категорично.
с NULL-ами это не катит.
Re: alter table похоже на баг [сообщение #5809 является ответом на сообщение #5808] Tue, 10 December 2024 18:41 Переход к предыдущему сообщениюПереход к следующему сообщению
avp в настоящее время не в онлайне  avp
Сообщений: 83
Зарегистрирован: October 2023
Member
А через ALTER COLUMN не доделано?
Я тут такое нашёл:
https://github.com/FirebirdSQL/firebird/issues/4538
Re: alter table похоже на баг [сообщение #5821 является ответом на сообщение #5809] Thu, 12 December 2024 18:48 Переход к предыдущему сообщению
protector в настоящее время не в онлайне  protector
Сообщений: 7
Зарегистрирован: May 2023
Junior Member

avp писал(а) Tue, 10 December 2024 18:41
А через ALTER COLUMN не доделано?
Я тут такое нашёл:
https://github.com/FirebirdSQL/firebird/issues/4538
Там написано что чарсет не меняется. А тут он в NONE улетает. Походу пока одно правили другое сломали.
Предыдущая тема: IBExpert Personal Edition. Perfomance Info
Следующая тема: mon$attachments
Переход к форуму:
  


Текущее время: Sat Dec 21 20:05:34 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00928 секунд