Преобразование на месте базы данных Postgresql из SQL_ASCII в UTF8 - PullRequest
2 голосов
/ 10 марта 2011

(не дубликат 4079956 )

У меня есть база данных SQL_ASCII, LC_CTYPE = LC_COLLATION = "C", которая содержит в основном данные ASCII, а такженекоторые не ASCII-символы из некоторой кодовой страницы, скажем LATIN1.

Я хочу транскодировать, на месте (нет pg_dump / pg-restore), все не-ASCII кодовые точкииз кодовой страницы LATIN1 в UTF-8, затем измените кодировку базы данных на UTF-8, например:

-- change encoding first, transcode data after
UPDATE pg_database SET encoding=pg_char_to_encoding('UTF8')
  WHERE datname='sqlasciidb';
UPDATE tbl SET str=convert_from(str::bytea, 'LATIN1')
  WHERE str::bytea<>convert_from(str::bytea, 'LATIN1')::bytea;

или

-- transcode data first, change encoding after
CREATE DOMAIN my_varlena AS bytea;
CREATE CAST (my_varlena AS text) WITHOUT FUNCTION;
UPDATE tbl SET str=convert(str::bytea, 'LATIN1','UTF8')::my_varlena::text
  WHERE str::bytea<>convert(str::bytea, 'LATIN1', 'UTF8');
DROP DOMAIN my_varlena CASCADE;
UPDATE pg_database SET encoding=pg_char_to_encoding('UTF8')
  WHERE datname='sqlasciidb';

Что, если что-то не так сПриведенный выше подход?

Некоторые проблемы, которые я вижу:

  • после обновления pg_database, все соединения с базой данных должны быть закрыты и вновь открыты, чтобы серверная часть учитывала новые
  • все индексы, основанные на измененных столбцах, должны быть перестроены

Что-нибудь еще?

1 Ответ

2 голосов
/ 11 марта 2011

Похоже, у вас есть суть.Я полагаю, вы уже пробовали это с тестовой базой данных?Я быстро проверил его, когда предлагал его кому-то, и мне показалось, что он работает нормально, хотя это было далеко от тщательного теста.

Мне кажется, что нужно сначала транскодировать, а потом менять кодировку, потому что покабаза данных все еще находится в SQL_ASCII, вам не придется иметь дело с ошибками postgresql, пытающимися интерпретировать еще не транскодированные или неправильно транскодированные данные, и вы можете смотреть на данные с относительной безнаказанностью.OTOH, изменяя кодировку в первую очередь, гарантирует, что только последующие соединительные бэкэнды будут записывать данные в UTF8 ...

Также есть проверка для таких вещей, как тела функций, определения представлений, определения ограничений и т. Д., Которые также могут нуждаться в транскодировании?(надеюсь, нет, но ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...