是否有SQL Server排序规则选项可以匹配不同的撇号?

时间:2017-12-06 17:56:11

标签: sql-server unicode collation

我目前正在使用带有SQL_Latin1_General_CP1_CI_AI排序规则的SQL Server 2016。正如预期的那样,带有字母e的查询将匹配带有字母e,è,é,ê,ë等的值,因为排序规则的重音不敏感选项。但是,使用'(U + 0027)的查询与包含'(U + 2019)的值不匹配。我想知道在这种情况下匹配是否存在这样的排序规则,因为它更容易输入'而不是知道'是按键Alt-0146。

2 个答案:

答案 0 :(得分:2)

我有信心拒绝。这里的主要内容是两个字符不同(尽管相似)。有了重音,e和ê仍然是e(只有一个有重音)。这使您(例如)可以对SELECT * FROM Games WHERE [Name] LIKE 'Pokémon%';之类的内容进行搜索,但仍然会有包含Pokemon返回的行(因为人们没有使用重音:P)。

我建议的最好的方法是使用REPLACE(至少在你的WHERE子句中),以便返回两行。然而,这可能会变得昂贵。

如果您知道哪些列会成为问题,那么您可以在该表中添加PERSISTED计算列。然后,您可以在WHERE子句中使用该列,但显示原始列。类似的东西:

USE Sandbox;
--Create Sample table and data
CREATE TABLE Sample (String varchar(500));

INSERT INTO Sample
VALUES ('This is a string that does not contain either apostrophe'),
       ('Where as this string, isn''t without at least one'),
       ('’I have one of them as well’'),
       ('’Well, I''m going to use both’');
GO
--First attempt (without the column)
SELECT String
FROM Sample
WHERE String LIKE '%''%'; --Only returns 2 of the rows
GO
--Create a PERSISTED Column
ALTER TABLE Sample ADD StringRplc AS REPLACE(String,'’','''') PERSISTED;
GO
--Second attempt
SELECT String
FROM Sample
WHERE StringRplc LIKE '%''%'; --Returns 3 rows
GO
--Clean up
DROP TABLE Sample;
GO

答案 1 :(得分:0)

另一个答案是正确的。没有这样的整理。您可以使用以下内容轻松验证。

DECLARE @dynSql NVARCHAR(MAX) = 
'SELECT * FROM ('  + 
(
SELECT SUBSTRING(
(
SELECT ' UNION ALL SELECT ''' + name + ''' AS name, IIF( NCHAR(0x0027) = NCHAR(0x2019) COLLATE ' + name + ', 1,0) AS Equal'
FROM sys.fn_helpcollations()
FOR XML PATH('')
), 12, 0+ 0x7fffffff)
)
 + ') t 
 ORDER BY Equal, name';

PRINT @dynSql;

EXEC (@dynSql);