2017-12-06 32 views
1

현재 SQL_Latin1_General_CP1_CI_AI 데이터 정렬로 SQL Server 2016을 사용하고 있습니다. 예상 한대로 문자 e를 사용하는 쿼리는 해당 데이터 정렬의 악센트를 구분하지 않으므로 문자를 e, è, é, ê, ë 등과 비교합니다. 그러나 '(U + 0027)가 포함 된 값은'(U + 2019)를 포함하는 값과 일치하지 않습니다. 이 사건이 일치하는 곳에 이러한 데이터 정렬이 있는지 알고 싶습니다. 입력하는 것이 더 쉽기 때문에 '키스트 로크 Alt-0146입니다'라는 것을 알고 있기 때문입니다.서로 다른 아포스트로피를 일치시킬 수있는 SQL Server 데이터 정렬 옵션이 있습니까?

답변

2

나는 아니오라고 확신합니다. 여기서 중요한 점은 두 문자가 다르다는 것입니다 (유사 함에도 불구하고). 악센트와 함께, e와 ê는 여전히 둘 다 e입니다 (단 하나의 악센트가 있음). 이렇게하면 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);