Tôi đã được giao nhiệm vụ di chuyển cơ sở dữ liệu PostgreSQL 8.2.x sang một máy chủ khác. Để thực hiện điều này, tôi đang sử dụng pgAdmin 1.12.2 (trên Ubuntu 11.04 bằng cách này) và sử dụng Sao lưu và Khôi phục bằng cách sử dụng định dạng tùy chỉnh / nén (.backup) và mã hóa UTF8.
Cơ sở dữ liệu ban đầu là trong UTF8, như vậy:
-- Database: favela
-- DROP DATABASE favela;
CREATE DATABASE favela
WITH OWNER = favela
ENCODING = 'UTF8'
TABLESPACE = favela
CONNECTION LIMIT = -1;
Tôi đang tạo cơ sở dữ liệu này chính xác như thế này trên máy chủ đích. Nhưng khi tôi khôi phục cơ sở dữ liệu từ tệp .backup bằng tùy chọn Khôi phục, nó sẽ cho tôi một số lỗi sau:
pg_restore: restoring data for table "arena"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2173; 0 35500 TABLE DATA arena favela
pg_restore: [archiver (db)] COPY failed: ERROR: invalid byte sequence for encoding "UTF8": 0xe3a709
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT: COPY arena, line 62
Khi tôi kiểm tra bản ghi nào đã gây ra lỗi này trong thực tế, một số trường vartext có các ký tự dấu phụ như ç (được sử dụng trong tiếng Bồ Đào Nha, ví dụ: "caça") và khi tôi xóa chúng khỏi văn bản trong bản ghi thì lỗi sẽ chuyển sang bản ghi tiếp theo có lỗi - vì khi sao chép có lỗi, nó sẽ dừng chèn dữ liệu trên bảng này. Và tôi không muốn thay thế chúng bằng tay từng cái một để thực hiện điều này.
Nhưng điều đó thật lạ vì với UTF8 không nên có loại vấn đề này, phải không?
Tôi không biết làm thế nào họ đến đó ngay từ đầu. Tôi chỉ di chuyển cơ sở dữ liệu và tôi cho rằng bằng cách nào đó cơ sở dữ liệu giống như trong LATIN1 và sau đó được thay đổi không chính xác thành UTF8.
Có cách nào để kiểm tra xem bảng / cơ sở dữ liệu có trình tự UTF8 không hợp lệ không? Hoặc có cách nào để thực thi / chuyển đổi các ký tự này thành UFT8 để tôi không gặp phải bất kỳ vấn đề nào khi thực hiện khôi phục không?
Cảm ơn trước.