কোনও ইউএনএফএল নেই, "ইউটিএফ 8": 0x00 এনকোডিংয়ের জন্য এখনও অবৈধ বাইট অনুক্রম নেই


12

পোস্টগ্র্রেএসকিউএল 8.4.9 এ 'মাইসকিल्डম্প - কম্প্যাটিবল = পোস্টগ্রিসক্ল' এর আউটপুট আমদানির চেষ্টা করার জন্য আমি গত 8 ঘন্টা অতিবাহিত করেছি এবং আমি এই নির্দিষ্ট সমস্যা সম্পর্কে ইতিমধ্যে এখানে এবং অন্য কোথাও কমপক্ষে 20 টি বিভিন্ন থ্রেড পড়েছি, কিন্তু খুঁজে পাইনি no বাস্তব ব্যবহারযোগ্য উত্তর যা কাজ করে।

মাইএসকিউএল 5.1.52 ডেটা ফেলে দেওয়া হয়েছে:

mysqldump -u root -p --compatible=postgresql --no-create-info --no-create-db --default-character-set=utf8 --skip-lock-tables rt3 > foo

গন্তব্য হিসাবে PostgreSQL 8.4.9 সার্ভার

'Psql -U rt_user -f foo' দিয়ে ডেটা লোড করা রিপোর্ট করছে (এর মধ্যে অনেকগুলি এখানে একটি উদাহরণ রয়েছে):

psql:foo:29: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
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".

নিম্নলিখিত অনুসারে, ইনপুট ফাইলটিতে কোনও NULL (0x00) অক্ষর নেই।

database-dumps:rcf-temp1# sed 's/\x0/ /g' < foo > nonulls
database-dumps:rcf-temp1# sum foo nonulls
04730 2545610 foo
04730 2545610 nonulls
database-dumps:rcf-temp1# rm nonulls

তেমনি, পার্লের সাথে অন্য একটি চেক কোনও নূলে নেই:

database-dumps:rcf-temp1# perl -ne '/\000/ and print;' foo
database-dumps:rcf-temp1#

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

database-dumps:rcf-temp1# psql -U rt_user --variable=client_encoding=utf-8 -c "SHOW client_encoding;" rt3
 client_encoding
-----------------
 UTF8
(1 row)

database-dumps:rcf-temp1#

নিখুঁত, এখনও:

database-dumps:rcf-temp1# psql -U rt_user -f foo --variable=client_encoding=utf-8 rt3
...
psql:foo:29: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
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".
...

"হোয়েলের মতে" সঠিক উত্তরটি বাদ দিয়ে যা শুনতে শুনতে চমত্কার হবে, এবং জেনেও যে আমি খুব কমই এই কদাচিৎ-রেফারেন্সযুক্ত ডেটার জন্য কোনও অ-এসসিআইআই অক্ষর সংরক্ষণ করার বিষয়ে সত্যই চিন্তা করি না, আপনার কী পরামর্শ আছে?

আপডেট: আমদানির সময় একই ডাম্প ফাইলের কেবলমাত্র ASCII- র সংস্করণে আমি একই ত্রুটি পেয়েছি। সত্যই মন-বগল:

database-dumps:rcf-temp1# # convert any non-ASCII character to a space
database-dumps:rcf-temp1# perl -i.bk -pe 's/[^[:ascii:]]/ /g;' mysql5-dump.sql
database-dumps:rcf-temp1# sum mysql5-dump.sql mysql5-dump.sql.bk
41053 2545611 mysql5-dump.sql
50145 2545611 mysql5-dump.sql.bk
database-dumps:rcf-temp1# cmp mysql5-dump.sql mysql5-dump.sql.bk
mysql5-dump.sql mysql5-dump.sql.bk differ: byte 1304850, line 30
database-dumps:rcf-temp1# # GOOD!
database-dumps:rcf-temp1# psql -U postgres -f mysql5-dump.sql --variable=client_encoding=utf-8 rt3
...
INSERT 0 416
psql:mysql5-dump.sql:30: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 455
INSERT 0 424
INSERT 0 483
INSERT 0 447
INSERT 0 503
psql:mysql5-dump.sql:36: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 502
INSERT 0 507
INSERT 0 318
INSERT 0 284
psql:mysql5-dump.sql:41: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 382
INSERT 0 419
INSERT 0 247
psql:mysql5-dump.sql:45: ERROR:  invalid byte sequence for encoding "UTF8": 0x00
HINT:  This error can also happen if the byte sequence does not match the encod.
INSERT 0 267
INSERT 0 348
^C

প্রশ্নের মধ্যে থাকা একটি সারণী হিসাবে সংজ্ঞায়িত করা হয়েছে:

                                        Table "public.attachments"
     Column      |            Type             |                        Modifie
-----------------+-----------------------------+--------------------------------
 id              | integer                     | not null default nextval('atta)
 transactionid   | integer                     | not null
 parent          | integer                     | not null default 0
 messageid       | character varying(160)      |
 subject         | character varying(255)      |
 filename        | character varying(255)      |
 contenttype     | character varying(80)       |
 contentencoding | character varying(80)       |
 content         | text                        |
 headers         | text                        |
 creator         | integer                     | not null default 0
 created         | timestamp without time zone |
Indexes:
    "attachments_pkey" PRIMARY KEY, btree (id)
    "attachments1" btree (parent)
    "attachments2" btree (transactionid)
    "attachments3" btree (parent, transactionid)

ডিবি স্কিমার কোনও অংশের জন্য টাইপ পরিবর্তন করার স্বাধীনতা আমার নেই। এটি করার ফলে সম্ভবত সফ্টওয়্যার ইত্যাদির ভবিষ্যতের আপগ্রেডগুলি নষ্ট হবে etc.

সম্ভবত সমস্যা কলামটি 'পাঠ্য' টাইপের 'সামগ্রী' (সম্ভবত অন্যান্য টেবিলের অন্যরাও)। আমি পূর্ববর্তী গবেষণা থেকে ইতিমধ্যে জানি, পোস্টগ্রাইএসকিউএল 'পাঠ্য' মানগুলিতে NULL অনুমতি দেবে না। তবে, দয়া করে উপরে দেখুন যেখানে সেড এবং পার্ল উভয়ই কোনও নুল অক্ষর প্রদর্শন করে না এবং তারপরে আরও নীচে যেখানে আমি সমস্ত ডাম্প ফাইল থেকে সমস্ত নন-এসসিআইআই অক্ষর ফেলা করেছি তবে এটি এখনও বাধা দেয়।


2
আপনার ডাম্প ফাইলের 29 লাইন দেখতে কেমন? এর মতো কিছু head -29 foo | tail -1 | cat -vব্যবহার হতে পারে।
মিউ খুব ছোট

প্রভাবিত টেবিলের সংজ্ঞা কী এবং আপত্তিজনক লাইনটি দেখতে কেমন?
tscho

এটি কোম্পানির ডেটা M 1MB। যদিও আপনি কোথায় আছেন অবশ্যই আমি বুঝতে পারি। চিন্তাভাবনার এই পংক্তির সমাপ্তি এখানে (দয়া করে আমার ফরাসিটিকে
টুকরো

tscho: ইঙ্গিত হিসাবে, উদাহরণস্বরূপ ত্রুটি লাইন এই ত্রুটি শত শত এক।
jblaine

উত্তর:


3

এই অক্ষর / পাঠ্য ক্ষেত্রগুলির মধ্যে এক বা একাধিক এর সামগ্রীতে 0x00 থাকতে পারে।

নিম্নলিখিত চেষ্টা করুন:

SELECT * FROM rt3 where some_text_field = 0x00 LIMIT 1;

যদি এটি কোনও একক সারিতে ফিরে আসে তবে সেই অক্ষর / পাঠ্য ক্ষেত্রগুলি সাথে আপডেট করার চেষ্টা করুন:

UPDATE rt3 SET some_text_field = '' WHERE some_text_field = 0x00;

এরপরে, আরও একটি এমওয়াইএসকিউএলডিএমপি চেষ্টা করুন ... (এবং পোস্টগ্রিসকিউএলআউটপুট পদ্ধতি)


এটি আমাকে আমার বিপথগামী শূন্য চরিত্রগুলি খুঁজে পেতে সহায়তা করেছিল, যদিও আমার ব্যবহারের প্রয়োজন ছিল colname LIKE concat('%', 0x00, '%')। সিরিয়ালযুক্ত পিএইচপি অ্যারেযুক্ত ক্ষেত্রগুলিতে সেগুলি পেয়েছি।
cimmanon

5

মাইএসকিউএল 5.0.51 সংস্করণ এবং পোস্টগ্রিস সংস্করণ 9.3.4.0 ব্যবহার করে আমার একই সমস্যা হয়েছিল। "ইউটিএফ 8": 0x00 "এনকোডিংয়ের জন্য" অবৈধ বাইট সিকোয়েন্সটি আমি সমাধান করেছি "ড্যানিয়েল ভুরিটের মন্তব্য দেখার পরে যে" পোস্টগ্র্যাস্কল মোডে মাইসকিल्डম্প্প নালী বাইটগুলি স্ট্রিংগুলিতে \ 0 হিসাবে ডাম্প করবে, তাই আপনি সম্ভবত অক্ষরের ক্রমটি অনুসন্ধান করতে চান। "

অবশ্যই নিশ্চিত যে একটি গ্রেপ অবশেষে ন্যূনএল অক্ষর প্রকাশ করেছে।

grep \\\\0 dump.sql

আমি নীচের কমান্ডটি ব্যবহার করে নুল চরগুলি প্রতিস্থাপন করেছি

sed -i BAK 's/\\0//g' dump.sql

পোস্টগ্রিস তখন ডাম্প.এসকিউএল সাফল্যের সাথে লোড করতে সক্ষম হয়েছিল


4

আপনি কোনও ত্রুটিযুক্ত বাইট বা ফাইলের কোনও অ-এস্কি অক্ষর ছাড়াই এই ত্রুটিটি পেতে পারেন। একটি utf8 ডাটাবেসের উদাহরণ:

select E'ab\0cd';

ফলন হবে:

ত্রুটি: "UTF8": 0x00 HINT এনকোডিংয়ের জন্য অবৈধ বাইট সিকোয়েন্স: সার্ভারের দ্বারা প্রত্যাশিত এনকোডিংয়ের সাথে বাইট সিকোয়েন্সটি মেলে না, তবে এই ত্রুটিটিও ঘটতে পারে যা "ক্লায়েন্ট_কেনডিং" দ্বারা নিয়ন্ত্রিত হয়।

পোস্টগ্র্যাস্কল মোডে মাইএসকিএলডাম নাল বাইটগুলিকে স্ট্রিংয়ে \ 0 হিসাবে ডাম্প করবে, তাই আপনি সম্ভবত অক্ষরের ক্রমটি অনুসন্ধান করতে চান।


0

আমি অর্ধেক এই জাতীয় সমস্যা মনে করি। আমার মনে হয় আমি স্কিমাটি স্থানান্তরিত করে সিএসভি হিসাবে ডেটা ফেলে রেখে সিএসভি ফাইল থেকে ডেটা লোড করেছিলাম। আমার মনে আছে সিএসভি ফাইলটি আপডেট করতে হবে (সেড বা ইউনিক্সটোডোর মতো ইউনিক্স সরঞ্জাম ব্যবহার করে) বা আমদানির পদক্ষেপে ত্রুটিযুক্ত কিছু আইটেম ঠিক করার জন্য ওপেন অফিস ক্যালক (এক্সেল) ব্যবহার করা - এটি খোলার মতো পুনরায় সাশ্রয়ী হিসাবে সহজ হতে পারে ফাইল।

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