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


13

আমি আজ এসকিউএল সার্ভারে কিছু আকর্ষণীয় আচরণ পেয়েছি (2005 এবং 2012 সালে পর্যবেক্ষণ করা হয়েছে) যে আমি আশা করছিলাম যে কেউ ব্যাখ্যা করতে পারে।

=একটি এনভিআর্কার ফিল্ড ব্যবহার করে তুলনা করছে এমন একটি ক্যোয়ারী স্ট্রিংয়ের পিছনের স্থানটিকে উপেক্ষা করেছে (বা তুলনার আগে মানটি স্বয়ংক্রিয়ভাবে ছাঁটাই করা হয়েছে) তবে likeঅপারেটর ব্যবহার করে একই ক্যোয়ারী স্থানটিকে উপেক্ষা করে নি। কোলেশন ব্যবহৃত হচ্ছে ল্যাটিন 1_ জেনারাল_সিআই_এএস ২০১২ in

এই এসকিউএল ফিডলটি বিবেচনা করুন: http://sqlfiddle.com/#!6/72262/4

দ্রষ্টব্য যে likeঅপারেটর পিছনে স্থান স্ট্রিংয়ের জন্য কোনও ফলাফল ফেরত দেয় না, তবে =অপারেটর তা করে। কেন?

বোনাস পয়েন্ট: আমি এটি একটি ভর্চারের ক্ষেত্রের প্রতিলিপি করতে অক্ষম, আমি ভেবেছিলাম যে কোনও স্থান উভয় উপাত্তের ক্ষেত্রে একইভাবে পরিচালিত হবে - এটি কি সত্য?


আমি একটি চেক সীমাবদ্ধতা লিখতে চাইছিলাম যে একটি স্ট্রিং ছাঁটা হয়েছিল। আমি একটি কার্যনির্বাহী সন্ধান পেয়েছি যা এই ব্লগেMyString+'x' = ltrim(rtrim(MyString))+'x' প্রস্তাবিত হিসাবে যাচাই করা উচিত
ডিফল্ট.ক্র্যামার

উত্তর:


15

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

পার্থক্য থেকে ডালপালা এসকিউএল মান Microsoft এর বাস্তবায়ন । স্ট্যান্ডার্ডটি বলেছে যে সাম্যতার জন্য পরীক্ষা করার সময়, সমতা অপারেটরের বাম এবং ডান উভয় স্ট্রিংকে একই দৈর্ঘ্যের জন্য প্যাড করতে হবে । এটি নিম্নলিখিত ফলাফল ব্যাখ্যা করে:

insert into test_padding (varchar_clmn, nvarchar_clmn) values ('space ', 'nspace ')
go
-- equality for varchar column
select count(*) from test_padding where varchar_clmn = 'space' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space    ' --returns 1
-- equality for nvarchar column
select count(*) from test_padding where nvarchar_clmn = 'nspace' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace    ' --returns 1

LIKE অপারেটর তার অপারেশনগুলিকে প্যাড করে না। এটি কলামের ধরণের জন্য VARCHARএবং আলাদাভাবে আচরণ করেNVARCHAR :

-- likeness for varchar column
select count(*) from test_padding where varchar_clmn like 'space' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space    ' -- returns 0
-- likeness for nvarchar column
select count(*) from test_padding where nvarchar_clmn like 'nspace' -- returns 0
select count(*) from test_padding where nvarchar_clmn like 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn like 'nspace    ' -- returns 0

ASCII প্রকারের জন্য LIKE অপারেটরের আচরণটি এসকিউএল সার্ভার-নির্দিষ্ট; ইউনিকোড প্রকারের জন্য এটি এএনএসআই-সম্মতিযুক্ত।


4

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

এসকিউএল CHAR প্রকারগুলি তখন থেকেই সমস্ত ধরণের দিকনির্দেশে বিকশিত হয়েছিল, তবে এটি অকল্পনীয় নয় যে আরও কিছু আধুনিক ডেটা ধরণের এখনও তাদের historicalতিহাসিক পূর্বসূরীদের কাছ থেকে কিছু বৈশিষ্ট্য উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে।


"আমাকে একটি বাধ্যতামূলক কেস দেখান যেখানে কোনও পাঠ্যের সাথে সংযুক্ত স্থানগুলির আসল আসল ব্যবসায়ের অর্থ হয়" - কিছু কাঁচা কনসোল আউটপুট এবং প্রাক-অনিরাপদ এক্সএমএল খণ্ডের মতো হোয়াইটস্পেস-উল্লেখযোগ্য ডেটা সংরক্ষণ করে।
দাই

1

লাইক (লেনদেন-এসকিউএল) এর জন্য ডকুমেন্টেশনে মাইক্রোসফ্ট লিখেছেন (জোর দেওয়া খনি):

লাইক ব্যবহার করে প্যাটার্ন ম্যাচিং

LIKE ASCII প্যাটার্ন ম্যাচিং এবং ইউনিকোড প্যাটার্ন মেলাকে সমর্থন করে। যখন সমস্ত যুক্তি ... ASCII অক্ষর ডেটা ধরণের হয়, তখন ASCII প্যাটার্ন মেলানো হয়। যদি কোনও আর্গুমেন্ট ইউনিকোড ডেটা টাইপের হয় তবে সমস্ত আর্গুমেন্ট ইউনিকোডে রূপান্তরিত হয় এবং ইউনিকোড প্যাটার্ন মেলানো হয়। আপনি যখন ইউনিকোড ডেটা ব্যবহার করেন ... লাইক সহ, ফাঁকা ফাঁকা স্থানগুলি উল্লেখযোগ্য; তবে, অ-ইউনিকোড ডেটার জন্য, ফাঁকা ফাঁকা স্থানগুলি উল্লেখযোগ্য নয়। ইউনিকোড লাইক আইএসও মানের সাথে সামঞ্জস্যপূর্ণ। ASCII LIKE এসকিউএল সার্ভারের পূর্ববর্তী সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ।

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