Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在WHERE子句中进行区分大小写的搜索(我正在使用SQL Server)?_Sql_Sql Server - Fatal编程技术网

如何在WHERE子句中进行区分大小写的搜索(我正在使用SQL Server)?

如何在WHERE子句中进行区分大小写的搜索(我正在使用SQL Server)?,sql,sql-server,Sql,Sql Server,我想在我的SQL查询中进行区分大小写的搜索。但默认情况下,SQLServer不考虑字符串的情况。 您知道如何在SQL查询中进行区分大小写的搜索吗?可以通过。默认情况下,它不区分大小写 摘自链接: SELECT 1 FROM dbo.Customers WHERE CustID = @CustID COLLATE SQL_Latin1_General_CP1_CS_AS AND CustPassword = @CustPassword COLLATE SQL_Latin1_Genera

我想在我的SQL查询中进行区分大小写的搜索。但默认情况下,SQLServer不考虑字符串的情况。

您知道如何在SQL查询中进行区分大小写的搜索吗?

可以通过。默认情况下,它不区分大小写

摘自链接:

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

或者,.

使用排序规则或转换为二进制,如下所示:

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 
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 
SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter
用户名/密码的重复存在是为了让引擎能够使用索引。上面的排序规则区分大小写,如有必要,请更改为所需的排序规则

第二个,转换为二进制,可以这样做:

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 
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 
SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter

您可以使用convert to varbinary进行查询,这非常简单。 例如:

使用二进制校验和

使用哈希字节

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

在MySQL中,如果您不想更改排序规则并希望执行区分大小写的搜索,则只需使用如下二进制关键字:

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 
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 
SELECT * FROM table_name WHERE binary username=@search_parameter and binary password=@search_parameter

使用Latin1_General_CS作为sql db中的排序规则

正如其他人所说,您可以执行区分大小写的搜索。或者将指定列的排序规则格式更改为“我”。对于数据库中的用户/密码列,我通过以下命令将其更改为排序规则:

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

这难道不意味着它不再是一个精确的比较吗?有时可能会返回真值,即它们实际上并不相同?我同意@O'Rooney,这有时会返回假阳性。阅读此问题的人可能会发现,阅读如何将列本身更改为区分大小写,从而消除在WHERE子句中使用排序规则的需要,这也很有用。请参阅:cast as varbinary方法在直接用于数据库时对我有效,但在从.NET应用程序发送相同语句时不起作用-不知道为什么。但是collate方法工作得很好。如果这个答案包括一个解释,说明在哪里放置搜索到的术语,即在哪里插入类似于常规like*word或PHASE*SQL搜索的短语。@CannedMan-您可以用与like语句相同的方法使用上述collate解决方案,那么这个答案将是完美的。只需执行以下操作即可返回所有大写字母“D”。从某个表中选择*,在该表中,列名(如“%D%”)将整理SQL\u Latin1\u General\u CP1\u CS\u ASIt与捷克字母表不兼容。测试词:“ukázka”。它作为列中的单个单词在表中,但您的搜索未找到它。这不是有效的SQL Server查询。我认为这就是MySQLWorks在MySQLHow上的完美之处,当我们有in=。与@CustIDCollation中的CustID在大多数情况下都适用一样,但如果数据中有其他语言字符,它将返回误报:/schwarz weißvs:/schwarz weissIt不适用于捷克字母表。测试词:“ukázka”。它在表中作为列中的单个单词,但您的搜索未找到它。不要将密码存储为纯文本!他们本应该被炒和腌的,然后比较的是炒和腌!这简直是一个糟糕的答案!