আমার পোস্টগ্র্রেএসকিউএল অর্ডার কেন মামলা-সংবেদনশীল?


27

আমার পোস্টগ্রিস 9.4.4 ডেবিয়ানের উপর চলছে এবং আমি নিম্নলিখিত ORDER BYআচরণটি পেয়েছি :

veure_test=# show LC_COLLATE;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
 regexp_split_to_table 
-----------------------
 a
 A
 b
 c
 Capacitor
 CD
 d
 D
(8 rows)

এবং uname -a:

Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux

যাইহোক, আমার আইম্যাকটিতে পোস্টগ্রিস 9.3.4 সহ আমি নিম্নলিখিতটি পেয়েছি:

veure_test=# show LC_COLLATE;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
 regexp_split_to_table 
-----------------------
 A
 CD
 Capacitor
 D
 a
 b
 c
 d
(8 rows)

এবং uname -a:

Darwin ---- 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 x86_64

আমি কেন দেবিয়ান সংস্করণটি কেস-সংবেদনশীল বলে মনে করি এবং ওএস এক্স সংস্করণটি তা নয় তা দ্বারা আমি সন্তুষ্ট। আমি কী অনুপস্থিত, বা অন্য কোন তথ্য দেওয়ার দরকার নেই?

আপডেট : আমার ম্যাকে, pg_collationটেবিলটি দেখায় যে আমার একটি en_US.UTF-8কোলেশন রয়েছে, তবে ডেবিয়ানে, আমার একটি en_US.utf8জোট রয়েছে। সুতরাং, আমার ম্যাক এ:

veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
   )
SELECT bar FROM foo
ORDER BY bar collate "en_US.UTF-8";                                                                                                                                                                                      
    bar    
-----------
 A
 CD
 Capacitor
 D
 a
 b
 c
 d
(8 rows)

এবং ডেবিয়ান:

veure_test=# with foo as (
SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') as bar
   )
SELECT bar FROM foo
ORDER BY bar collate "en_US.utf8";
    bar    
-----------
 a
 A
 b
 c
 Capacitor
 CD
 d
 D
(8 rows)

সুতরাং en_US.UTF-8এবং en_US.utf8বিভিন্ন সাজানোর আদেশ আছে?


আমার কাছে পরীক্ষা করার জন্য কোনও ম্যাক নেই, তাই আমি এখানে অন্ধকারে শুটিং করছি ... ম্যাকের ক্ষেত্র 'D d a A c b CD Capacitor'হিসাবে স্ট্রিংটি কাস্ট করা হচ্ছে না এমন কোনও সম্ভাবনা text? IE, চেষ্টা করুন SELECT regexp_split_to_table('D d a A c b CD Capacitor'::text, ' ') ORDER BY 1;এবং দেখুন কী হয় ...
ক্রিস

একই ফলাফল। অন্যান্য খবরে দেখা যাচ্ছে যে select * from pg_collationদেবিয়ান বাক্সটি দেখায় en_US.utf8, যখন ওএস এক্স রয়েছে en_US.UTF-8। এগুলি সম্পর্কিত বাক্সগুলিতে সুস্পষ্টভাবে জোটবদ্ধ করার জন্য বিভিন্ন ধরণের অর্ডার দেখায় :(
কার্টিস পো

এবং আমি একটি আপডেট পোস্ট করেছি যা সমস্যার ব্যাখ্যা দিতে পারে তবে আমার জন্য এটি রহস্যকে আরও গভীর করে তোলে। এবং আমি এটি এখন পেয়েছি: স্ট্যাকওভারফ্লো / প্রশ্ন / ১৯৯67575৫৫৫/২ এবং এটি: স্ট্যাকওভারফ্লো.com
কার্টিস পো

7
দুর্ভাগ্যক্রমে পোস্টগ্র্রেস ওএস থেকে কোলেশন বাস্তবায়ন ব্যবহার করে যা এই ধরণের আচরণকে ওএসকে নির্ভর করে (যা আমি ব্যক্তিগতভাবে কোনও বাগ হিসাবে বিবেচনা করি - একটি ডিবিএমএস ওএস নির্বিশেষে অভিন্ন আচরণ করবে)। সুতরাং এটি ডেবিয়ান এবং ওএসএক্স-এর মধ্যে সিস্টেম লাইব্রেরিগুলির মধ্যে পার্থক্যের জন্য
উত্থিত হয়

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

উত্তর:


16

সুতরাং en_US.UTF-8এবং en_US.utf8বিভিন্ন সাজানোর আদেশ আছে?

না, এই দু'টিই এক, নামকরণের এক আলাদা কনভেনশন।

আমি কেন দেবিয়ান সংস্করণটি কেস-সংবেদনশীল বলে মনে করি এবং ওএস এক্স সংস্করণটি তা নয় তা দ্বারা আমি সন্তুষ্ট।

হ্যাঁ আপনি সঠিক. এটি ম্যাকের ডিফল্ট আচরণ। কোডসগুলি UTF8এনকোডিংয়ের জন্য কোনও BSD-ish OS (Incl। OSX) এ কাজ করে না।

এটি প্রমাণ করার জন্য এখানে একটি উল্লেখ রয়েছে:

সাজানোর ক্রমের সমস্যা (ইউটিএফ 8 লোকাল কাজ করে না

হিসাবে a_horse_with_no_name বললেন, Postgres ওএস থেকে কোলেশন বাস্তবায়ন ব্যবহার করে। উভয় অপারেটিং সিস্টেমে একই ফল পাওয়ার কোনও উপায় নেই।

আপনি আপনার যদি (আমি সম্ভবত হতে পারে বলেছেন) may ভালো করুন: ORDER BY lower(fieldname)


2
ORDER BY function()সম্ভাব্য বৃহত রেজাল্টস ব্যবহার করার সময় পারফরম্যান্স যাচাই করার জন্য যত্ন নিন - কারণ এটি একটি সূচককে বাছাইয়ের জন্য ব্যবহার করা বন্ধ করে দেয় এটি সম্ভবত অতিরিক্ত ধরণের ক্রিয়াকলাপ ঘটায় (সম্ভবত ডিস্কে) এবং এটি আপনার ক্যোয়ারিকে আরও বিস্তৃতভাবে আক্রমণ করার পদ্ধতি ক্যোয়ারার পরিকল্পনাকারীর পদ্ধতির পরিবর্তন করতে পারে ।
ডেভিড স্পিললেট

@ ডেভিড স্পিললেট: আপনি অর্ডার ফাংশনটি সম্পর্কে ঠিক বলেছেন। আমি মনে করি যে আমার উত্তরটি কেন আইএম্যাক এবং ডেবিয়ানে বিভিন্ন ধরণের বাছাইয়ের ফ্যাশন করছে তার দিকে বেশি কেন্দ্রীভূত। ধন্যবাদ
জাসাপকোটা 10

1
হ্যাঁ, আপনার উত্তর পুরোপুরি ঠিক আছে এবং প্রশ্নটি পুরোপুরি coversেকে দেয়। "ক্যোয়ারী প্ল্যানকে প্রভাবিত করতে পারে এমন পরিবর্তনের পরে সত্যিকারের ডেটা দিয়ে পরীক্ষা করা" উল্লেখ করা যদিও আমার মধ্যে অভ্যাসগত প্রতিক্রিয়া হয়ে দাঁড়িয়েছে (অনেকটা ব্যাকআপের কোনও আলোচনায় পরীক্ষার উল্লেখ করার মতো, এবং যেমন) ভুলে যাওয়া সহজ (বা লোকেরা প্রায়শই করেন) বা এমনকি ডেটাবেস কাজের ক্ষেত্রে নতুনদের ক্ষেত্রেও জানা নেই।
ডেভিড স্পিললেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.