ฉันได้รับมอบหมายให้ย้ายฐานข้อมูล PostgreSQL 8.2.x ไปยังเซิร์ฟเวอร์อื่น เมื่อต้องการทำสิ่งนี้ฉันใช้ pgAdmin 1.12.2 (บน Ubuntu 11.04 โดยวิธี) และใช้การสำรองข้อมูลและคืนค่าโดยใช้รูปแบบที่กำหนดเอง / บีบอัด (.backup) และการเข้ารหัส UTF8
ฐานข้อมูลดั้งเดิมอยู่ใน UTF8 ดังนี้:
-- Database: favela
-- DROP DATABASE favela;
CREATE DATABASE favela
WITH OWNER = favela
ENCODING = 'UTF8'
TABLESPACE = favela
CONNECTION LIMIT = -1;
ฉันกำลังสร้างฐานข้อมูลนี้อย่างนี้บนเซิร์ฟเวอร์ปลายทาง แต่เมื่อฉันกู้คืนฐานข้อมูลจากไฟล์. backup โดยใช้ตัวเลือก Restore มันทำให้ฉันมีข้อผิดพลาดบางอย่าง:
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
เมื่อฉันตรวจสอบว่าระเบียนใดที่ทริกเกอร์ข้อผิดพลาดนี้อันที่จริงแล้วบางฟิลด์ vartext มีอักขระกำกับเช่นç (ใช้ในภาษาโปรตุเกสเช่น "caça") และเมื่อฉันลบพวกเขาออกจากข้อความในบันทึกข้อผิดพลาดที่ผ่านไปยังระเบียนถัดไป ที่มีพวกเขา - เนื่องจากเมื่อการคัดลอกมีข้อผิดพลาดมันจะหยุดการแทรกข้อมูลในตารางนี้ และฉันไม่ต้องการแทนที่ด้วยตนเองทีละคนเพื่อให้บรรลุนี้
แต่มันค่อนข้างแปลกเพราะ UTF8 ไม่น่าจะมีปัญหาแบบนี้ใช่มั้ย
ฉันไม่รู้ว่าพวกเขาไปถึงที่นั่นได้อย่างไรตั้งแต่แรก ฉันเพิ่งย้ายฐานข้อมูลและฉันคิดว่าอย่างใดฐานข้อมูลเป็นเหมือนใน LATIN1 แล้วเปลี่ยนเป็น UTF8 อย่างไม่เหมาะสม
มีวิธีใดบ้างในการตรวจสอบว่าตาราง / ฐานข้อมูลมีลำดับ UTF8 ที่ไม่ถูกต้องหรือไม่ หรือวิธีใด ๆ ในการบังคับใช้ / เปลี่ยนอักขระเหล่านี้กลับเป็น UFT8 ดังนั้นฉันจึงไม่พบปัญหาใด ๆ เมื่อฉันทำการกู้คืน
ขอบคุณล่วงหน้า.