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