উত্স ডাটাবেসটি ইউটিএফ 8 এ এনকোড থাকা অবস্থায় পুনরুদ্ধারে ইউটিএফ 8 অবৈধ বাইট সিকোয়েন্স অনুলিপি ত্রুটিগুলি কীভাবে সমাধান করবেন?


17

আমাকে একটি পোস্টগ্রেএসকিউএল 8.2.x ডাটাবেস অন্য সার্ভারে স্থানান্তরিত করার কাজ দেওয়া হয়েছিল। এটি করার জন্য আমি পগএডমিন ১.১২.২ ব্যবহার করছি (উবুন্টু ১১.০৪ তে উপায়) এবং কাস্টম / কমপ্রেস ফর্ম্যাট (। ব্যাকআপ) এবং ইউটিএফ 8 এনকোডিং ব্যবহার করে ব্যাকআপ এবং পুনরুদ্ধার ব্যবহার করছি।

মূল ডাটাবেসটি ইউটিএফ 8 এ রয়েছে:

-- Database: favela

-- DROP DATABASE favela;

CREATE DATABASE favela
  WITH OWNER = favela
       ENCODING = 'UTF8'
       TABLESPACE = favela
       CONNECTION LIMIT = -1;

আমি ঠিক এই গন্তব্য সার্ভারে এই ডাটাবেস তৈরি করছি। কিন্তু যখন আমি পুনঃস্থাপন বিকল্পটি ব্যবহার করে .ব্যাকআপ ফাইলটি থেকে ডাটাবেস পুনরুদ্ধার করি তখন এটি আমাকে এই ত্রুটিগুলির কিছু দেয়:

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

যখন আমি পরীক্ষা করি যে কোন রেকর্ডটি এই ত্রুটিটি ট্রিগার করেছে আসলে কিছু প্রান্তের ক্ষেত্রের মধ্যে ডায়াক্রিটিক্যাল অক্ষর রয়েছে characters (পর্তুগিজ ভাষায় ব্যবহৃত হয়, উদাহরণস্বরূপ, "caça"), এবং যখন আমি ম্যানুয়ালি রেকর্ডগুলির মধ্যে পাঠ্য থেকে সরিয়ে ফেলি ত্রুটিটি পরবর্তী রেকর্ডে চলে যায় এতে সেগুলি রয়েছে - যেহেতু অনুলিপিটিতে একটি ত্রুটি থাকে তখন এটি এই টেবিলটিতে ডেটা .োকানো বন্ধ করে দেয়। এবং এটি সম্পাদন করার জন্য আমি একে একে তাদের ম্যানুয়ালি প্রতিস্থাপন করতে চাই না।

তবে এটি একপ্রকার অদ্ভুত কারণ ইউটিএফ 8 এর সাথে এই ধরণের সমস্যা হওয়া উচিত নয়, তাই না?

আমি জানি না তারা কীভাবে সেখানে প্রথম স্থান পেল। আমি কেবল ডাটাবেস স্থানান্তর করছি, এবং আমি অনুমান করি যে কোনওভাবে LATIN1 তে ডাটাবেসটি ছিল এবং তারপরে ভুলভাবে ইউটিএফ 8 এ পরিবর্তন করা হয়েছিল।

কোনও টেবিল / ডাটাবেসে অবৈধ ইউটিএফ 8 সিকোয়েন্স আছে কিনা তা পরীক্ষা করার কোনও উপায় আছে কি? অথবা এই অক্ষরগুলি ইউএফটি 8 তে প্রয়োগ / পুনঃবর্তিত করার কোনও উপায় যাতে আমি পুনরুদ্ধারটি সম্পাদন করি তখন কোনও সমস্যায় পড়ি না?

আগাম ধন্যবাদ.

উত্তর:


8

ইন্টারনেটের চারপাশে খনন করা, আমি দেখেছি এটি একটি খুব সাধারণ সমস্যা। সাধারণ সমাধান হ'ল প্লেইন টেক্সট ফর্ম্যাট ডাম্প ব্যবহার করা এবং এনকোডিংটি সংশোধন করতে আইকনভি এর মাধ্যমে এটিকে খাওয়ানো।

এখানে যে সম্পর্কে আরও তথ্য।


অবৈধ প্রতীকগুলি বাতিল করে ইউটিএফ -32 এ রূপান্তর করতে আইকনভি ব্যবহার করুন এবং তারপরে ইউটিএফ -8 এ ফিরে যান, একটি ইউটিএফ -8 থেকে ইউটিএফ -8 রূপান্তর সমস্ত খারাপ কোড পয়েন্ট ধরবে না। (যেমন এতিম সারোগেটস)
জেসেন

7

"আমি জানি না তারা কীভাবে সেখানে প্রথম স্থান পেল"

এখানে বর্ণিত হিসাবে এটি ঘটতে পারে - যদিও এটি 8.4 এ ত্রুটি উত্পন্ন করে:

আপনি যদি কোনও পাঠ্য প্রকারের (যেমন পাঠ্য, বর্ণচর (10) ইত্যাদি) সহ একটি সারণী তৈরি করেন, তবে আপনি সেই ক্ষেত্রটিতে অষ্টাল এস্কেপস ব্যবহার করে একটি অবৈধ বাইট অনুক্রম সন্নিবেশ করতে পারেন।

উদাহরণস্বরূপ, আপনার যদি একটি ইউটিএফ 8-এনকোডড ডাটাবেস থাকে তবে আপনি এটি করতে পারেন:

=> টেবিল ফু (টি টেক্সট) তৈরি করুন;

=> ফু ভ্যালুতে অন্তর্ভুক্ত করুন (ই '\ 377');

এখন, আপনি যদি টেবিলটি অনুলিপি করেন তবে আপনি ফলাফলটি পুনরায় কপি করতে পারবেন না That এর অর্থ আপনার পিজি_ডাম্প ব্যাকআপগুলি পুনরুদ্ধার করতে সক্ষম হবে না। আপনার ডেটা আবার ফিরে আসার একমাত্র উপায় হ'ল মানটি আবার পালানো।

সাধারণ সমস্যাগুলি এবং সেগুলি মোকাবেলার কিছু উপায় সম্পর্কে এই দুর্দান্ত ব্লগে একটি ভাল পোস্ট রয়েছে


1

এটি সম্ভবত আপনার ইউনিক্স / লিনাক্স পরিবেশে ব্যবহৃত ডিফল্ট এনকোডিংয়ের সাথে। বর্তমানে কোন এনকোডিংটি ডিফল্ট একটি তা পরীক্ষা করতে নিম্নলিখিতগুলি সম্পাদন করুন:

$ echo $LANG
en_US

এই ক্ষেত্রে, আমরা স্পষ্ট দেখতে পাচ্ছি এটি কোনও ইউটিএফ -8 এনকোডিং নয়, অনুলিপি কমান্ডটি নির্ভর করে।

সুতরাং এটির সমাধানের জন্য, আমরা কেবল নীচে উদাহরণস্বরূপ ল্যাং ভেরিয়েবল সেট করেছি:

$ export LANG=en_US.UTF-8

দ্রষ্টব্য: এটি কেবল বর্তমান সেশনের জন্য উপলব্ধ available এটি ~ / .bashrc এ যোগ করুন বা ভবিষ্যতের কোনও শেল সেশন শুরু করার সময় এটি উপলভ্য।

উল্লেখ


1

আমি প্লেইন টেক্সট ডাম্পে অন্ধভাবে আইকনভি চলার প্রস্তাব দিচ্ছি না কারণ এটি বৈধ অক্ষরগুলি (যেমন: চীনা অক্ষর) কে অন্য কয়েকটি অক্ষরে রূপান্তর করতে পারে। কমান্ডের নীচে চালিয়ে অবৈধ ইউটিএফ 8 চরিত্রটি খুঁজে পাওয়া ভাল।

grep -naxv '.*' plain_text_dump.sql

এবং তারপরে নির্দিষ্ট ডেটাতে আইকনভিভ চালান। পদক্ষেপ ব্যাখ্যার বিশদ পদক্ষেপের জন্য এই দস্তাবেজটি পরীক্ষা করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.