পোস্টগ্রিসএসকিউএল ডাটাবেসে এলসি_সিটিওয়াইপির প্রভাব কী?


25

সুতরাং, আমি পোস্টগ্র্রেএসকিউএল সহ কয়েকটি দেবিয়ান সার্ভার রেখেছি। .তিহাসিকভাবে, ser সার্ভারগুলি এবং পোস্টগ্রিসকিউএল ল্যাটিন 9 চরসেটের সাথে স্থানীয়করণ করা হয়েছে এবং ফিরে এসে তা ঠিক ছিল। এখন আমাদের পোলিশ, গ্রীক বা চীনা হিসাবে জিনিসগুলি পরিচালনা করতে হবে, সুতরাং এটি পরিবর্তন করা একটি ক্রমবর্ধমান ইস্যুতে পরিণত হয়।

আমি যখন কোনও ইউটিএফ 8 ডাটাবেস তৈরি করার চেষ্টা করেছি, আমি বার্তাটি পেয়েছি:

ত্রুটি: এনকোডিং UTF8 লোকেলের সাথে মেলে না fr_FR বিশদ বিবরণ: নির্বাচিত LC_CTYPE সেটিংটির জন্য LATIN9 এনকোডিং দরকার।

আমার পুরানো পাল গুগলের সাথে আমি কয়েকবার এই বিষয়ে কিছু গবেষণা করেছি এবং আমি যে কিছু খুঁজে পেতে পারি তা হ'ল ডিবিয়ান আপডেট করা LANG, সঠিক অক্ষর সহ পোস্টগ্রের এসকিউএল পুনরায় কম্পাইল করা, সমস্ত LC_সিস্টেমের ভেরিয়েবলগুলি সম্পাদনা করা এবং অন্যান্য অস্পষ্ট সমাধানগুলি। আপাতত, আমরা এই বিষয়টিকে একপাশে ছেড়ে দিই।

সম্প্রতি, এটি আবার ফিরে এসেছিল, গ্রীকরা স্টাফ চায় এবং লাতিন 9 চায় না। এবং যখন আমি আবার এই বিষয়টির দিকে তাকাচ্ছিলাম, তখন একজন সহকর্মী আমার কাছে এসে বললেন, "নাহ, এটি সহজ, দেখুন"।

তিনি কিছুই সম্পাদনা করেননি, যাদু কৌশল করেন নি, তিনি এই এসকিউএল কোয়েরিটি করেছেন:

CREATE DATABASE my_utf8_db
  WITH ENCODING='UTF8'
       OWNER=admin
       TEMPLATE=template0
       LC_COLLATE='C'
       LC_CTYPE='C'
       CONNECTION LIMIT=-1
       TABLESPACE=pg_default;

এবং এটা ভাল কাজ করে।

আমি আসলে সম্পর্কে জানতাম না LC_CTYPE='C'এবং আমি অবাক হয়েছিলাম যে এটি ব্যবহার করা গুগলে এবং এমনকি স্ট্যাক ওভারফ্লোতে প্রথম সমাধানগুলিতে ছিল না। আমি চারপাশে তাকিয়েছিলাম এবং আমি কেবল পোস্টগ্রিজ এসকিউএল ডকুমেন্টেশনে একটি উল্লেখ পেয়েছি।

যখন এলসি_সিটিওয়াই সি বা পসআইএক্স হয়, কোনও অক্ষর সেট অনুমোদিত হয় তবে এলসি_সিটিওয়াইপির অন্যান্য সেটিংসের জন্য কেবলমাত্র একটি অক্ষর সেট রয়েছে যা সঠিকভাবে কাজ করবে। যেহেতু এলসি_সিটিওয়াইপি সেটিংটি ডিআইডিবি দ্বারা হিমায়িত হয়ে গেছে, আপনি সি বা পসিক্স স্থানীয় নির্বাচন না করে (যেমন কোনও আসল স্থানীয় সচেতনতা অক্ষম করবেন) বাদে ক্লাস্টারের বিভিন্ন ডাটাবেসে বিভিন্ন এনকোডিংগুলি ব্যবহার করার আপাত নমনীয়তা বাস্তবের চেয়ে তাত্ত্বিক।

সুতরাং এটি আমাকে অবাক করে দিয়েছে, এটি খুব সহজ, খুব নিখুঁত, খারাপ দিকগুলি কী? এবং এখনও একটি উত্তর খুঁজে পেতে আমার বেশ কষ্ট হয়েছে। সুতরাং এখানে আমি এখানে পোস্ট করতে আসা:

tl; dr: নির্দিষ্ট স্থানীয়করণের মাধ্যমে ব্যবহারের নেতিবাচক দিকগুলি কী কী LC_CTYPE='C'? এটা করা কি খারাপ? আমার কী ভাঙার আশা করা উচিত?

উত্তর:


26

নির্দিষ্ট স্থানীয়করণের জন্য এলসি_সিটিওয়াই = 'সি' ব্যবহারের ক্ষয়ক্ষতিগুলি কী কী?

ডকুমেন্টেশনে লোকেল সাপোর্টে লোকেল এবং এসকিউএল বৈশিষ্ট্যগুলির মধ্যে সম্পর্কের উল্লেখ রয়েছে :

স্থানীয় সেটিংগুলি নিম্নলিখিত এসকিউএল বৈশিষ্ট্যগুলিকে প্রভাবিত করে:

  • অর্ডার বাই বা পাঠ্য ডেটাতে স্ট্যান্ডার্ড তুলনা অপারেটরগুলি ব্যবহার করে প্রশ্নের ক্রম সাজান

  • উপরের, নিম্ন এবং initcap ফাংশন

  • প্যাটার্ন ম্যাচিং অপারেটরগুলি (লাইক, সিমিলার টু, এবং পসিক্স-স্টাইল নিয়মিত এক্সপ্রেশন); লোকালগুলি অক্ষরের সাথে সংবেদনশীল মিলে যাওয়া এবং চরিত্রের-শ্রেণীর নিয়মিত প্রকাশের দ্বারা অক্ষরের শ্রেণিবিন্যাস উভয়কেই প্রভাবিত করে

  • ফাংশনগুলির To_char পরিবার

  • LIKE ধারাগুলির সাথে সূচকগুলি ব্যবহার করার ক্ষমতা

প্রথম আইটেমটি (সাজানোর ক্রম) প্রায় LC_COLLATEএবং অন্যরা সমস্ত কিছু সম্পর্কে রয়েছে বলে মনে হচ্ছে LC_CTYPE

LC_COLLATE

LC_COLLATEস্ট্রিংয়ের মধ্যে তুলনা প্রভাবিত করে। অনুশীলনে, সর্বাধিক দৃশ্যমান প্রভাবটি হ'ল সাজানো ক্রম। LC_COLLATE='C'(বা POSIXযা একটি প্রতিশব্দ) এর অর্থ হল এটি বাইট ক্রম যা তুলনা চালায়, অন্যদিকে language_REGIONফর্মের একটি লোকেলের অর্থ সংস্কৃতিগত বিধিগুলি তুলনা চালাবে।

ফরাসী নামগুলির একটি উদাহরণ, যা কোনও ইউটিএফ -8 ডাটাবেসের ভিতরে থেকে সম্পাদিত হয়:

select firstname from (values ('bernard'), ('bérénice'), ('béatrice'), ('boris'))
 AS l(firstname)
order by firstname collate "fr_FR";

ফলাফল:

 নামের প্রথম অংশ 
-----------
 Beatrice
 bérénice
 বার্নার্ড
 বরিস

béatriceএর আগে আসে boris, কারণ উচ্চারণকৃত E এর তুলনা করে ও-এর তুলনা করা হয় যেন এটি অ-উচ্চারণকৃত। এটি একটি সাংস্কৃতিক নিয়ম।

এটি একটি Cলোকেলের সাথে ঘটে যাওয়া থেকে পৃথক :

select firstname from (values ('bernard'), ('bérénice'), ('béatrice'), ('boris')) 
 AS l(firstname)
order by firstname collate "C";

ফলাফল:

 নামের প্রথম অংশ 
-----------
 বার্নার্ড
 বরিস
 Beatrice
 bérénice

এখন উচ্চারণযুক্ত ই সহ নামগুলি তালিকার শেষে ধাক্কা দেওয়া হয়। বাইট প্রতিনিধিত্ব éহল UTF-8 হেক্সাডেসিমেল হয় C3 A9এবং জন্য oএটা 6f। লোকেলের নীচে এর c3চেয়ে বড় ।6fC'béatrice' > 'boris'

এটি কেবল উচ্চারণ নয়। হাইফেনেশন, বিরামচিহ্ন এবং অদ্ভুত অক্ষরের মতো আরও জটিল নিয়ম রয়েছে œ। অদ্ভুত সাংস্কৃতিক নিয়ম প্রতিটি লোকালয়ে আশা করা যায়।

এখন যদি তুলনা করার স্ট্রিংগুলি বিভিন্ন ভাষার মিশ্রণের সাথে ঘটে থাকে, যেমনটি firstnameঅন্যান্য বিশ্বের সমস্ত লোকের জন্য একটি কলাম রয়েছে, তবে এটি সম্ভবত কোনও নির্দিষ্ট লোকালকে প্রভাবিত করা উচিত নয়, কারণ বিভিন্ন ভাষার জন্য বিভিন্ন বর্ণমালা ডিজাইন করা হয়নি একে অপরের বিরুদ্ধে বাছাই

এই ক্ষেত্রে Cএকটি যুক্তিযুক্ত পছন্দ, এবং এটি দ্রুত হওয়ার সুবিধা রয়েছে কারণ কোনও কিছুই খাঁটি বাইট তুলনা তুলতে পারে না।

LC_CTYPE

রয়ে LC_CTYPE'সি' সেট করা বুঝানো মতো সি ফাংশন isupper(c)বা tolower(c)কেবলমাত্র US-ASCII সীমার মধ্যে অক্ষরের জন্য প্রত্যাশিত ফলাফল দিতে (যেমন, ইউনিকোড মধ্যে কোডপয়েন্ট 0x7F পর্যন্ত)।

এইজন্য কারণ sql ফাংশন পছন্দ upper(), lower()বা initcap এই libc ফাংশন উপরে Postgres বাস্তবায়িত হয়, তখন তারা যত তাড়াতাড়ি সেখানে স্ট্রিং অ US-ASCII অক্ষরগুলি এই দ্বারা প্রভাবিত করছি।

উদাহরণ:

test=> show lc_ctype;
  lc_ctype   
-------------
 fr_FR.UTF-8
(1 row)

-- Good result
test=> select initcap('élysée');
 initcap 
---------
 Élysée
(1 row)

-- Wrong result
-- collate "C" is the same as if the db has been created with lc_ctype='C'
test=> select initcap('élysée' collate "C");
 initcap 
---------
 éLyséE
(1 row)

জন্য Cলোকেল, éএকটি uncategorizable চরিত্র হিসাবে গণ্য হবে।

একইভাবে ভুল ফলাফলগুলি নিয়মিত প্রকাশের সাথেও পাওয়া যায়:

test=> select 'élysée' ~ '^\w+$';
 ?column? 
----------
 t
(1 row)

test=> select 'élysée' COLLATE "C" ~ '^\w+$';
 ?column? 
----------
 f
(1 row)

সুতরাং আমি যদি এটি সঠিকভাবে পাই তবে আপনি ইউটিএফ -8 সার্ভার তৈরি করে থাকলেও আমাদের অর্ডার সমস্যা থাকবে? আমার ধারণা, ইউটিএফ -8-এ সেট করা সিস্টেমটি এলসি_সিটিওয়াইপি রয়েছে, বা ইউটিএফ -8-এ পোস্টগ্রিএসকিউএল সংকলন করা আপনার পয়েন্ট হিসাবে একই তুলনা ইস্যুটির ফলাফল করবে will
গ্রেগোয়ার ডি

এটি প্রসারিত করার জন্য, কোয়েটগুলিকে কোয়েরিতে জোর করা কি সম্ভব হবে যাতে তুলনাটি স্থানীয়ভাবে সঠিক হবে?
গ্রেগোয়ার ডি 14

হ্যাঁ, ইনভিডুয়াল স্ট্রিং তুলনাগুলি তাদের নিজস্ব কোলিং বিধিগুলি এম্বেড করতে পারে, যেমন আমি উত্তরটির collate "C"পরে এর সাথে এই জবাবটি করি order by। আপনার অ্যাপ্লিকেশনটির প্রয়োজন কোথায় এবং তা নির্ধারণ করা আপনার উপর নির্ভর করে। বাইরে বেশিরভাগ অ্যাপ্লিকেশন সত্যই যত্ন করে না।
ড্যানিয়েল ভ্যারিট

1
এছাড়াও নোট করুন যে পৃথক কলামগুলিতে একটি COLLATEনির্দিষ্টকারী থাকতে পারে যা ডাটাবেসের চেয়ে পৃথক।
ড্যানিয়েল ভ্যারিট

2
এই উত্তরটি সত্যিই LC_COLLATE এর জন্য, এলসি_সিটিওয়াইপি নয়। এলসি_সিটিওয়াইপি কোনও অক্ষর একটি অঙ্ক, বর্ণ, সাদা স্থান, বিরামচিহ্ন ইত্যাদি কিনা তা স্থির করতে ব্যবহৃত হয়
জাজানেস

10

কোলিশেশন ব্যবহার করে বাছাই সম্পর্কে ড্যানিয়েলের গৃহীত উত্তরের প্রসঙ্গে, দয়া করে সচেতন হন যে আপনি যদি কোনও ম্যাকের পোস্টগ্রিএসকিউএল চালাচ্ছেন তবে অপারেটিং সিস্টেমের স্তরে কিছু কোলেশনের জন্য অপ্রতুল সেটিংসের কারণে আপনার পছন্দসই কলশনটি আপনি যেমন আশা করেন তেমন কাজ করতে পারে না। আপনি এখানে সমস্যাটি সম্পর্কে আরও পড়তে পারেন:

http://www.postgresql.org/message-id/4B4E845F.80906@postnewspapers.com.au

এটি পোস্টগ্র্রেএসকিউএল নির্দিষ্ট সমস্যা নয়, বিশেষত, বরং কোলেশন সেটিংসের জন্য ম্যাকের ডিফল্ট কনফিগারেশনের ক্ষেত্রে সমস্যা। আমার বর্তমান সিস্টেমটি ওএস এক্স এল ক্যাপিটান সংস্করণ 10.11 এ পোস্টগ্রিজ এসকিউএল 9.3 চলছে এবং এই সমস্যায় ভুগছে। আমি "fr_FR" বা "en_US" কোলেশন ব্যবহার না করেই আমার সিস্টেম একই ক্যোয়ারির ফলাফলগুলি প্রদান করে। উদাহরণ স্বরূপ:

"Fr_FR" কোলেশন ব্যবহার করে:

select firstname from (values ('bernard'), ('bérénice'), ('béatrice'), ('boris'))
AS l(firstname)
order by firstname collate "fr_FR";

results:
==============
bernard
boris
béatrice
bérénice

"En_US" কোলেশন ব্যবহার করে:

select firstname from (values ('bernard'), ('bérénice'), ('béatrice'), ('boris'))
AS l(firstname)
order by firstname collate "en_US";

results:
==============
bernard
boris
béatrice
bérénice

আমার সিস্টেমে কোলেশন সেটিংস (অপারেটিং সিস্টেমের স্তরে), "fr_FR" এবং "en_US" এর জন্য শেলটিতে ডিফ করে চালিয়ে প্রদর্শিত হয়:

cd /usr/share/locale
diff fr_FR.UTF-8/LC_COLLATE en_US.UTF-8/LC_COLLATE

আশা করি এই অতিরিক্ত তথ্যটি যে কেউ এই সমস্যায় ভুগছেন এমন ম্যাকের পোস্টগ্রিজ এসকিউএল ব্যবহার করছেন এমন সকলের পক্ষে এটি সহায়ক।


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