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