SQL区分大小写的字符串比较

amc*_*ack 207 sql sql-server

如何比较字符串,以便只有在每个字符串的情况相同时才进行比较.例如:

Select * from a_table where attribute = 'k'
Run Code Online (Sandbox Code Playgroud)

...将返回属性为"K"的行.我不想要这种行为.

amc*_*ack 357

Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 
Run Code Online (Sandbox Code Playgroud)

诀窍.

  • 我通常使用Latin1_General_Bin (4认同)
  • 是的,标准方法是使用不区分大小写的排序规则,尽管排序规则本身是特定于供应商的.你的SQL Server语法? (3认同)
  • 就我而言,我的数据库中有 1 列区分大小写。我需要将它与标准 (CI) 色谱柱进行比较。我使用了这个的变体 WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS) (2认同)
  • 谢谢,但是Latin1_General_CS_AS是什么?它是特殊关键字吗? (2认同)
  • @VijaySinghRana`Latin1_General_CS_AS`是排序规则的规范。整理是指一组确定数据如何排序和比较的规则。有关更多信息,请参见[本页](http://www.databasejournal.com/features/mssql/article.php/3302341/SQL-Server-and-Collat​​ion.htm)。 (2认同)

小智 46

您还可以使用以下语法将该属性转换为区分大小写:

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS
Run Code Online (Sandbox Code Playgroud)

现在,您的搜索将区分大小写.

如果您想再次使该列不区分大小写,请使用

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)


QMa*_*ter 27

您可以轻松地将列转换为VARBINARY(最大长度),长度必须是您希望避免缺陷比较的最大长度,足以将长度设置为列长度.修剪列帮助您比较实际值,除了空间有意义并在表格列中有价值,这是一个简单的示例,您可以看到我修剪列值然后转换和比较:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))
Run Code Online (Sandbox Code Playgroud)

希望这有帮助.

  • 正是我在寻找的东西.一种简单的方法,可以进行一次性区分大小写的比较,以查找包含大写字符的条目. (2认同)

Dav*_*ton 17

正如另一种选择,您可以使用HASHBYTES,如下所示:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')
Run Code Online (Sandbox Code Playgroud)

  • @DavidKlempfner 为什么不首先进行比较,如果它们匹配,那么还检查哈希字节?我们可以将其设为一个函数并像 StringsAreCaseSensitiveEqual(a, b) => a = b AND HASHBYTES('sha1', a) = HASHBYTES('sha1', b) 一样调用它 (4认同)
  • 碰撞呢?这很少见,但我认为会有多个字符串散列到相同的值。 (3认同)

小智 7

简化一般答案

SQL 区分大小写的字符串比较

这些示例可能会有所帮助:

Declare @S1 varchar(20) = 'SQL'
Declare @S2 varchar(20) = 'sql'

  
if @S1 = @S2 print 'equal!' else print 'NOT equal!' -- equal (default non-case sensitivity for SQL

if cast(@S1 as binary) = cast(Upper(@S2) as binary) print 'equal!' else print 'NOT equal!' -- equal

if cast(@S1 as binary) = cast(@S2 as binary) print 'equal!' else print 'NOT equal!' -- not equal

if  @S1 COLLATE Latin1_General_CS_AS  = Upper(@S2) COLLATE Latin1_General_CS_AS  print 'equal!' else print 'NOT equal!' -- equal

if  @S1 COLLATE Latin1_General_CS_AS  = @S2 COLLATE Latin1_General_CS_AS  print 'equal!' else print 'NOT equal!' -- not equal

 
Run Code Online (Sandbox Code Playgroud)

转换可能比哈希字节的运行时计算更有效,我希望整理可能更快。