Postgresql 8.1.x и UTF-8

В PostgreSQL начиная с версии 8.1.4 ужесточили правила конверсии из UTF-8 в однобайтовые кодировки. Если раньше при неконвертируемом символе было предупреждение, которое попадало в лог (или в приложение, если оно читало Warnings) и все работало, то сейчас неправильный символ приводит к ошибке и запрос не выполняется.

Тут же выяснилось, что у этих криворуких уродов таблица преобразования из/в windows-1251 неверная, там пропущен символ €. Пришлось, как водится, править.

патч для таблиц перекодировки UTF8<->CP1251 PostgreSQL 8.1.4 и 8.1.5

Заметим, что введение такой безусловной функциональности в minor-версии &mdash это моветон. Разработчики нам обещают, что в пределах minor-а все будет работать без backup/restore базы, а это нифига не так, приложения просто перестали работать совсем. Впрочем, багу с конверсией посчитали vulnerability, что вполне верно если перекодировке подвергается пользовательский ввод. Но не во всех приложениях это впрямую пользовательский ввод, более того у нас правильность символов контролируется на этапе ввода, а значит нам такая неотключаемая проверка нафиг не нужна.

Пришлось делать патч, который ее относительно safe выключает: все неизвестные символы при преобразовании UTF8->однобайтная кодировка меняются на пробел. Вот этот патч: качать. Естественно, этот патч можно рекомендовать только тем, кто понимает что делает.