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

Код: 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
13.10.2015, 09:36
    #39075105
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение CHARACTER SET поля
IBExpert,

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

Через изменение типа домена-то оно работает, без шума и пыли. Значит, должно работать и через изменение типа поля.
Либо грязно ругаться в обоих случаях.
...
Рейтинг: 0 / 0
13.10.2015, 09:53
    #39075121
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение CHARACTER SET поля
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
13.10.2015, 09:58
    #39075128
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение CHARACTER SET поля
в принципе работать через 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
13.10.2015, 10:02
    #39075133
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение CHARACTER SET поля
Симонов Денис,

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


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

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

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

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

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

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


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