কীভাবে কোনও বিভাগে কেস সংবেদনশীল অনুসন্ধান করবেন (আমি এসকিউএল সার্ভার ব্যবহার করছি)?


150

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

এসকিউএল কোয়েরিতে কীভাবে কেস কেসে সংবেদনশীল অনুসন্ধান করবেন সে সম্পর্কে কোনও ধারণা?

উত্তর:


174

কোলেশন পরিবর্তন করার মাধ্যমে করা যেতে পারে । ডিফল্টরূপে এটি ক্ষেত্রে সংবেদনশীল।

লিঙ্ক থেকে অংশ:

SELECT 1
FROM dbo.Customers
WHERE   CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS
    AND CustPassword = @CustPassword COLLATE SQL_Latin1_General_CP1_CS_AS

বা, কলামগুলি কেস সংবেদনশীল হিসাবে পরিবর্তন করুন


2
পরিবর্তে = থাকলে আমাদের কীভাবে ব্যবহার করতে হয়। (@ কাস্টিড) যেখানে হ'ল কাস্টম
রিনুথোমাজ

কোলেশন বেশিরভাগ ক্ষেত্রে কাজ করে তবে আপনার ডেটাতে যদি অন্য ভাষার অক্ষর পাওয়া যায় তবে এটি মিথ্যা ইতিবাচক প্রত্যাবর্তন করবে: /schwarz-weißবনাম:/schwarz-weiss
ল্যাজলো

162

কোলিশেশন ব্যবহার করে বা বাইনারিটিতে কাস্টিং ব্যবহার করে:

SELECT *
FROM Users
WHERE   
    Username = @Username COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Password = @Password COLLATE SQL_Latin1_General_CP1_CS_AS
    AND Username = @Username 
    AND Password = @Password 

ব্যবহারকারীর নাম / পাসওয়ার্ডের সদৃশ উপস্থিতি ইঞ্জিনকে সূচকগুলি ব্যবহারের সম্ভাবনা দেয়। উপরের কোলেশনটি হ'ল কেস সেনসিটিভ কোলেশন, আপনার যদি প্রয়োজন হয় তবে এটি পরিবর্তন করুন।

দ্বিতীয়টি, বাইনারিতে ingালাই এইভাবে করা যেতে পারে:

SELECT *
FROM Users
WHERE   
    CAST(Username as varbinary(100)) = CAST(@Username as varbinary))
    AND CAST(Password as varbinary(100)) = CAST(@Password as varbinary(100))
    AND Username = @Username 
    AND Password = @Password 

13
এই প্রশ্নটি পড়তে থাকা লোকেরা কীভাবে সংবেদনশীল হতে কলামটি পরিবর্তন করতে পারে তা পড়তে দরকারী হতে পারে যা WHERE ধারাটিতে কোলেশন ব্যবহারের প্রয়োজনীয়তা দূর করে। দেখুন: স্ট্যাকওভারফ্লো.com
লোফগ্রেন

2
সরাসরি ডাটাবেসে ব্যবহার করার সময় ভেরিবিনারি পদ্ধতি হিসাবে castালাই আমার জন্য কাজ করেছিল, কিন্তু। নেট অ্যাপ্লিকেশন থেকে একই বিবৃতি প্রেরণ করার সময় কাজ করেনি - কেন কারণ তা জানেন না। কিন্তু কোলেটের পদ্ধতিটি ভাল কাজ করেছিল।
ডগ

1
এই উত্তরটি নিখুঁত হবে যদি এটিতে অনুসন্ধানের শব্দটি কোথায় রাখা উচিত, অর্থাৎ যেখানে নিয়মিত like "*word or phrase*"এসকিউএল অনুসন্ধানের অনুরূপ বাক্যটি সন্নিবেশ করা হবে তার একটি ব্যাখ্যা অন্তর্ভুক্ত থাকে।
ক্যানড ম্যান

@ ক্যানডম্যান - আপনি লাইক স্টেটমেন্টের সাথে উপরের কল্টের সমাধানটি একইভাবে ব্যবহার করতে পারেন। সমস্ত আপার কেস 'ডি' ফিরিয়ে দেওয়ার জন্য কেবল নিম্নলিখিতটি করুন। "কোথাও কোথাও টেবিল থেকে নির্বাচন করুন যেখানে '% ডি%' এর মতো কলামের নাম কল করুন এসকিউএল_ল্যাটিন 1_ জেনারেল_সিপি 1_সিএস_এস"
র‌্যাডার্ডজ

এটি চেক বর্ণমালা দিয়ে কাজ করে না। পরীক্ষিত শব্দ: 'ukázka'। এটি একটি কলামে সিজ শব্দ হিসাবে টেবিলের মধ্যে রয়েছে, কিন্তু আপনার অনুসন্ধান এটি খুঁজে পায় নি।
জান ম্যাচেক 22'18

14

আপনি ভেরিবাইনিতে রূপান্তর করে ক্যোয়ারী তৈরি করতে পারেন - এটি খুব সহজ। উদাহরণ:

Select * from your_table where convert(varbinary, your_column) = convert(varbinary, 'aBcD') 

2
এটি চেক বর্ণমালা দিয়ে কাজ করে না। পরীক্ষিত শব্দ: 'ukázka'। এটি একটি কলামে সিজ শব্দ হিসাবে টেবিলের মধ্যে রয়েছে, কিন্তু আপনার অনুসন্ধান এটি খুঁজে পায় নি।
জান মাচেক

7

বিনার_চেখসুম ব্যবহার করুন

SELECT 
FROM Users
WHERE   
    BINARY_CHECKSUM(Username) = BINARY_CHECKSUM(@Username)
    AND BINARY_CHECKSUM(Password) = BINARY_CHECKSUM(@Password)

3
এর মানে কি হবে না, এটি আর কোনও সঠিক তুলনা নয়? কখনও কখনও এমন হতে পারে যে এটি সত্য যে তারা আসলে একই নয়?
ও'রুনি

3
আমি @ ওরুনিকে সম্মতি জানাই এটি উপলক্ষে মিথ্যা ইতিবাচক প্রত্যাবর্তন করে।
ডেস হর্সলে

5

HASHBYTES ব্যবহার করুন

declare @first_value nvarchar(1) = 'a'
declare @second_value navarchar(1) = 'A'

if HASHBYTES('SHA1',@first_value) = HASHBYTES('SHA1',@second_value) begin
    print 'equal'
end else begin
    print 'not equal'
end

-- output:
-- not equal

... যেখানে ধারা

declare @example table (ValueA nvarchar(1), ValueB nvarchar(1))

insert into @example (ValueA, ValueB)
values  ('a', 'A'),
        ('a', 'a'),
        ('a', 'b')

select  ValueA + ' = ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) = hashbytes('SHA1', ValueB)

-- output:
-- a = a

select  ValueA + ' <> ' + ValueB
from    @example
where   hashbytes('SHA1', ValueA) <> hashbytes('SHA1', ValueB)

-- output:
-- a <> A
-- a <> b

অথবা একটি মান খুঁজে পেতে

declare @value_b nvarchar(1) = 'A'

select  ValueB + ' = ' + @value_b
from    @example
where   hashbytes('SHA1', ValueB) = hasbytes('SHA1', @value_b)

-- output:
-- A = A

5

লাতিন 1_ জেনারাল_সিএসকে আপনার স্কোবিলে ডিবিতে আপনার জোট হিসাবে ব্যবহার করুন


2

মাইএসকিউএলে আপনি যদি কোলেশন পরিবর্তন করতে না চান এবং কেস সংবেদনশীল অনুসন্ধান করতে চান তবে কেবল বাইনারি কীওয়ার্ডটি ব্যবহার করুন :

SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter

2
এটি কোনও বৈধ এসকিউএল সার্ভার কোয়েরি নয়। আমি মনে করি এটি মাইএসকিউএল
জন তিরজন

2
মাইএসকিউএল
ডাব্লুএম


-4

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

ALTER TABLE `UserAuthentication` CHANGE `Password` `Password` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL;

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