2017-12-06 28 views
1

現在、SQL_Latin1_General_CP1_CI_AI照合でSQL Server 2016を使用しています。期待どおり、照合のアクセントを区別しないオプションのため、文字eの照会は値e、e、e、e、eなどと一致します。ただし、 '(U + 0027)を含むクエリはa'(U + 2019)を含む値と一致しません。このケースが一致する場所に照合が存在するかどうかを知りたいのですが、入力するのが簡単だからキーストローク「Alt-0146」です。異なるアポストロフィを一致させるSQL Serverの照合オプションがありますか?

答えて

2

いいえ、私は確信していません。ここで重要なのは、2つの文字が異なることです(類似していますが)。アクセントでは、eとêはまだ両方ともe(ただ1つはアクセントあり)です。これにより、たとえばSELECT * FROM Games WHERE [Name] LIKE 'Pokémon%';などの検索を行い、Pokemonの返信を含む行が残っています(ユーザーはアクセントを使用していないため、P)。

私が示唆できる最も良いことは、両方の行が返されるようにREPLACE(少なくともWHERE句で)を使用することです。しかし、それはおそらく高価になるでしょう。

問題の列がわかっている場合は、PERSISTED Computed Columnをそのテーブルに追加することができます。その後、あなたは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 
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); 
関連する問題