WHERE句で大文字と小文字を区別して検索する方法(SQL Serverを使用しています)


150

SQLクエリで大文字と小文字を区別する検索を実行したいのですが。ただし、デフォルトでは、SQL Serverは文字列の大文字と小文字を考慮しません。

SQLクエリで大文字と小文字を区別する検索を行う方法に関するアイデアはありますか?

回答:


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
代わりに使用する場合の使用方法=。WHERE CustID in(@CustID)のように
rinuthomaz 2017

照合順序はほとんどの場合に機能しますが、データに他の言語の文字がある場合、誤/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 

ユーザー名/パスワードの重複は、インデックスを使用する可能性をエンジンに与えるために存在します。上記の照合順序は大文字と小文字を区別する照合順序です。必要に応じて、必要な照合順序に変更してください。

2番目の方法は、バイナリへのキャストで、次のように実行できます。

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句で照合を使用する必要がなくなります。参照:stackoverflow.com/a/485394/908677
Elijah Lofgren

2
varbinaryメソッドとしてのキャストは、データベースで直接使用すると機能しましたが、.NETアプリケーションから同じステートメントを送信すると機能しませんでした。理由はわかりません。しかし、collat​​eメソッドはうまくいきました。
Doug

1
この回答は、検索対象の用語を配置する場所の説明、つまり通常のlike "*word or phrase*"SQL検索と同様の語句が挿入される場所の説明が含まれている場合に最適です。
缶詰の男性

@CannedMan-上記の照合ソリューションをLIKEステートメントと同じ方法で使用できます。次のようにして、すべて大文字の「D」を返します。"SELECT * FROM SomeTable WHERE ColumnName like '%D%' COLLATE SQL_Latin1_General_CP1_CS_AS"
Radderz

チェコ語のアルファベットでは機能しません。テストされた単語: 'ukázka'。それは、列にある一語として表にありますが、検索では見つかりませんでした。
JanMacháček18年

14

varbinaryへの変換を使用してクエリを作成できます。これは非常に簡単です。例:

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

2
チェコ語のアルファベットでは機能しません。テストされた単語: 'ukázka'。それは、列にある一語として表にありますが、検索では見つかりませんでした。
JanMacháček18年

7

BINARY_CHECKSUMを使用

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

3
これは、正確な比較ではなくなったことを意味しますか?それらが実際には同じではないということがtrueを返すことがありますか?
O'Rooney 2015

3
私は@ O'Rooneyが時々偽陽性を返すことに同意します。
Des Horsley、2015

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

... where句内

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


2

MySQLでは、照合順序を変更せず、大文字と小文字を区別したい場合は、次のようにバイナリキーワードを使用します。

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

2
これは有効なSQL Serverクエリではありません。それはMySQLだと思います
Jon Tirjan '19

2
MySQLで完全に動作します
WM 2017


-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.