Сен 20, 2014

Интересная ситуация при добавлении поля в FireBird (кириллические символы в наименовании поля).

Столкнулся с интересной ситуацией.
Предыстория. Реализуя очередное ТЗ, мне требовалось добавить в таблицу n-ое количество полей. СУБД — firebird. Кодировка базы UTF8. Ну и халявный для стран экс-СССР IBExpert.

Полей было много, список был предоставлен заказчиком, думать о названиях не надо было. Названия были длинные, поэтому я просто копировал их и вставлял. И вот после добавления очередного поля, что-то происходит и вылетает сообщение об ошибке. (Для добавления полей использовался IbExpert).
Скрин сообщения об ошибке:

Сообщение об ошибе

Со мной такое случилось в первый раз, поэтому я решил, что это косяк IbExpert-a. Перезапускаю его, открываю нужную базу, нахожу таблицу, которую правил, пробую открыть ее — ан нет, ничего там нет. Повторил еще раз для убедительности. Но не помогло. Сижу думаю. Зная заказчиков — решил проверить кодировку строки (название поля, которое пытался добавить), и как оказалось, не зря. Строка содержала кириллический символ, «ALX-344» — буква «Х»  была кириллической.

Ну что ж, ошибка ясна, нужно придумать как исправить. Решение в лоб — это дропнуть таблицу, и восстановить из бэкапа, благо бэкапы делаются регулярно. Но это как-то не спортивно, решил поискать другой вариант, что-нибудь, что позволило бы починить текущую таблицу. Быстрый поиск в интернете результат не дал, ну или я не правильно спрашивал. Подумал и решил посмотреть, а что у нас в системных таблицах. Информация о полях таблиц содержится в таблицу RDB$Relation_Fields.

Пробуем выбрать всю информацию по нужной таблицу, для это пишем простенький запрос:

select rf.*
from Rdb$Relation_Fields rf
where rf.Rdb$Relation_Name = 'Table_Name'

И… получаем сообщение об ошибке, то же что и на указанном выше скрине.

Стало все понятно.

Для исправления ошибки была выбраны записи без текстовых полей, и удалена последняя запись, запрос на выборку:

select rf.Rdb$Field_Position, rf.Rdb$Field_Source
from Rdb$Relation_Fields rf
where rf.Rdb$Relation_Name = 'Table_Name'

Вот такие вот бывают ситуации.

Вывод: Копипаст — это конечно хорошо, но не стоит на него всегда полагаться. Данные предоставленные заказчиком, лучше подвергнуть проверке, сэкономит и время и нервы 😉

Опубликовать в Facebook
Опубликовать в Google Plus

Leave a comment

Анти спам *