PostgreSQL 8.4 ব্যবহার করে, কীভাবে বাইটায়াকে পোস্টগ্র্যাসে পাঠ্য মানে রূপান্তর করা যায়?


16

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

ইনপুট স্ট্রিং : \n\t\f\b\p\k\j\l\mestPrepared

আউটপুট স্ট্রিং: \\012\\011\\014\\010pkjlmestPrepared

আউটপুট স্ট্রিং ডাটাবেসে sertedোকানো হয়। এখন আমি JDBC ব্যবহার করে জাভা কোডে ডাটাবেস থেকে সেই তথ্যটি পুনরুদ্ধার করি। আমি কীভাবে স্ট্রিংটিকে তার মূল মূল্যে ফিরিয়ে আনতে পারি?

আমি দুটি সম্ভাব্য পদ্ধতির কথা ভেবেছিলাম,

  1. ডাটাবেস পুনরুদ্ধার ক্যোয়ারী পরিবর্তন করুন এবং এই ক্ষেত্রটি পোস্টগ্রিজের যেকোন স্ট্রিং ম্যানিপুলেশন ফাংশনে পাস করুন যা বাইটায়াকে পাঠ্যে রূপান্তর করতে পারে।
  2. জাভা কোডে ডিকোডিং করুন।

আমি বুঝতে পারি যে পদ্ধতির 1 আরও কার্যকর হবে। আমি এখানে তালিকাবদ্ধ প্রায় সমস্ত ফাংশন চেষ্টা করেছি কিন্তু কিছুই কাজ করছে না। সাহায্য করুন!!

আমি একটি লিনাক্স মেশিনে পোস্টগ্রিজ 8.4 সংস্করণ ব্যবহার করছি।


2
জেডিবিসি ড্রাইভার বাইটায় ডিকোড করার কথা। এর সাথে কী হয়েছে ResultSet.getBytes()?
ড্যানিয়েল ভ্যারিট

@ ড্যানিয়েলভিটিé আমি এটি চেষ্টা করব এবং আপনাকে সে সম্পর্কে জানাবো
অমিত

উত্তর:


8

আপনি কি বিন্যাসটি encode(data bytea, format text)দিয়ে চেষ্টা করেছেন escape? সিনট্যাক্স এ এর ​​যে formatকোনও হতে পারে,

  • করুন Base64-
  • সম্মোহন
  • অব্যাহতি

সুতরাং encode(E'123\\000456'::bytea, 'hex')বেটিয়া হেক্স-এনকোড হিসাবে আউটপুট হবে।


এটি প্রশ্নের সমাধান হওয়া উচিত, যদি না আপনি নিশ্চিত হন যে এটি সমস্যার সমাধান করে। যদি এটি সমস্যার সমাধান করে, আপনি কীভাবে এবং কীভাবে ভবিষ্যতের পাঠকদের উপকারের জন্য এটি কাজ করে তা ব্যাখ্যা করতে পারেন?
ম্যাক্স ভার্নন

@ ভালগোগ আমি ইতিমধ্যে এটি চেষ্টা করেছি ..
অমিত

6

BYTEA কে পাঠ্য রূপে রূপান্তর করার জন্য আপনাকে পাঠ্যের অভ্যন্তরীণ এনকোডিংটি জানতে হবে। এনকোডিংটি না জেনে আপনি করার মতো কিছুই নেই। একটি সাধারণ textকলামে, ডাটাবেসটি পাঠ্য হিসাবে SERVER_ENCODINGযেমন সেট করা থাকে তেমন সঞ্চয় করে । উদাহরণস্বরূপ, আপনার উদাহরণে \nঅনুবাদ করা হয় \012। আচ্ছা, এটি এনকোডিংয়ের সম্পত্তি। এটি মহাবিশ্বের জন্য বস্তুনিষ্ঠভাবে সত্য নয়।

আপনি যদি সেই এনকোডিংটি জানেন, তবে এটি সহজ ..

  1. আমরা আপনার ইনপুট স্ট্রিংটিকে এনকোডেড আক্ষরিক হিসাবে নিই।
  2. আমরা encodeএটা। এটি একটি পালানো স্ট্রিং (প্রকার text) উত্পাদন করে ।
  3. তারপরে আমাদের এক ধরণের পেতে এটি আবার ডিকোড করতে হবে bytea
  4. এখন একটি থাকার কারণে byteaআমাদের ফিরে যেতে অনুমতি দেয় না text। এটি আমাদের কী টেক্সট ফর্ম্যাটটি byteaব্যবহার করছে তা জানাতে হবে convert_from। আমরা এটি ইউটিএফ -8 বলি।

এখানে একটি উদাহরণ।

SELECT convert_from(decode(x, 'escape'), 'UTF-8')
FROM encode(E'\n\t\f\b\p\k\j\l\mestPrepared'::bytea, 'escape')
  AS t(x);

5

অনুগামীদের জন্য, যেহেতু এটি "বাইটায়াকে পাঠ্যে রূপান্তরিত করার" জন্য আদর্শ প্রশ্ন হিসাবে মনে হয় (যেমন আপনি এটি আসলে পিজএডমিন ইত্যাদিতে দেখতে পারেন)। এখানে এটি কীভাবে দেখার উপযোগী হবে তা এখানে:

select encode(table.your_column_name, 'escape') as some_name from table_name

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