(не дубликат 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
, все соединения с базой данных должны быть закрыты и вновь открыты, чтобы серверная часть учитывала новые - все индексы, основанные на измененных столбцах, должны быть перестроены
Что-нибудь еще?