powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменение CHARACTER SET поля
12 сообщений из 12, страница 1 из 1
Изменение CHARACTER SET поля
    #39075101
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:

Код: sql
1.
create table A (B varchar(10) character set none)



Требуется изменить чарсет поля B.
Следующий оператор отрабатывает, но чарсет не меняет:
Код: sql
1.
alter table A alter column B type varchar(10) character set utf8



Но изменение соответствующего системного домена работает:
Код: sql
1.
alter domain RDB$XX type varchar(10) character set utf8



Проверено в 2.5 и 3.
Собственно, вопрос: так и задумано или задумано не так? ИМХО, чарсет должен меняться и первым способом.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075105
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

у меня есть большие сомнения в том, что любой чарсет можно поменять на любой другой без огребания проблем.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075108
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денису меня есть большие сомнения в том, что любой чарсет можно поменять на любой другой без огребания проблем.

Через изменение типа домена-то оно работает, без шума и пыли. Значит, должно работать и через изменение типа поля.
Либо грязно ругаться в обоих случаях.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075121
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

Код: sql
1.
2.
3.
4.
5.
6.
7.
create domain d1 as char(10) character set none;

create table t1(s d1);

insert into t1(s) values ('абвгд');

commit;



делаем

Код: sql
1.
select * from t1



всё нормально

Код: sql
1.
2.
3.
4.
5.
alter domain d1 type char(10) character set utf8;

insert into t1(s) values ('абвгдежзик');

commit;



делаем

Код: sql
1.
select * from t1



снова всё OK. А теперь наоборот изменим на однобайтный чарсет

Код: sql
1.
alter domain d1 type char(10) character set none;



оператор прошёл успешно

пробуем

Код: sql
1.
select * from t1



получаем шваброй по лбу

Код: plaintext
1.
2.
3.
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.
expected length 10, actual 40.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075128
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе работать через alter column должно. Но тогда надо в FB добавить контроль по совместимости чарсетов, так же как это сделано для размеров строк.

К примеру

Код: sql
1.
create domain d2 as char(40);



не позволит изменить на меньший размер

Код: sql
1.
alter domain d2 type char(10);



авторThis operation is not defined for system tables.
unsuccessful metadata update.
ALTER DOMAIN D2 failed.
New size specified for column D2 must be at least 40 characters.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075133
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Мой вопрос совсем о другом: тихое (!) нежелание менять чарсет через ALTER TABLE ... ALTER COLUMN TYPE - это баг или фича?
То, что изменение чарсета может привести к проблемам - я в курсе.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075138
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНо тогда надо в FB добавить контроль по совместимости чарсетов, так же как это сделано для размеров строк.


Сам по себе контроль каких-то размеров здесь ничего не даст, в поле с чарсетом NONE вполне могут лежать данные в UTF8. И наоборот.
Да и не об этом мой вопрос...
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075141
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

Размер должен косвенно контролироваться. В character set none это 10 байт, в utf8 - 40 значит нельзя менять utf8 в none без смены размера до 40.

IBExpert нежелание менять чарсет через ALTER TABLE ... ALTER COLUMN TYPE - это баг или фича?

ИХМО бага.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075238
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы сказал, что надо выбрасывать ошибку вместо тихого no-op. И для доменов тоже ругаться. Ибо в обоих случаях нельзя гарантировать совместимость данных. В идеале можно допустить смену чарсета для пустой таблицы (для домена потребуется отследить все его зависимости), но вряд ли будем с этим заморачиваться.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075494
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, dimitr

смена чарсета столбца (или домена) - это примерно то же самое, что и смена типа (с инт на строку или обратно). То есть, можно получить "шваброй по лбу", зато можно поменять тип.
Так что, я бы допустил (смену чарсета). Иначе и alter column надо запрещать.
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075502
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

да, но ALTER COLUMN ... TYPE запрещает менять тип на несовместимый.
INT на строку можно, а наоборот запрещено
...
Рейтинг: 0 / 0
Изменение CHARACTER SET поля
    #39075580
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALTER у нас [почти никогда] не читает данные. Поэтому допускаются только те операции, которые априори корректны, независимо от хранимых значений. Именно поэтому можно увеличить длину столбца, но нельзя уменьшить. Большинство преобразований чарсетов декларативно валидировать невозможно, разве что кроме ASCII->что-то-там или что-то-там->UTF8 (и то не всегда, насколько помню). Поэтому я и написал, что надо ругаться.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Изменение CHARACTER SET поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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