문제

테이블 (데이터가있는 기존 테이블)이 있고 해당 테이블에는 열 사용자 이름이 있습니다. 이 사용자 이름이 독특하기를 원합니다. 그래서 나는 다음과 같은 제약을 추가합니다.

ALTER TABLE Users 
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])

이제이 테이블에 중복 사용자가 존재한다는 오류가 계속 표시됩니다. 그러나 다음 쿼리를 사용하여 데이터베이스를 확인했습니다.

SELECT COUNT(UserId) as NumberOfUsers, UserName 
FROM Users 
GROUP BY UserName, UserId 
ORDER BY UserName

이로 인해 사용자 목록은 모두 숫자를 가진 사람으로 1을 갖습니다. 따라서 중복이 없습니다. 그러나 사용자 이름을 확인하면 실패합니다. 다음 결과가 나타납니다.

beluga
béluga

따라서 그는 "E"와 "é"또는 "è"를 비교하지 못합니다 ... 그는 이것을 무시하는 것과 같습니다. SQL이 고유 한 주요 기부금을 추가 할 때 이러한 악센트를 무시하지 않는 방법이 있습니까?

해결책:

너희들에게 thx 나는 솔루션을 찾았다. 이것은 문제를 해결했습니다.

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
도움이 되었습니까?

해결책

당신이 사용하는 콜레이션은 아마도 비교할 때 케이스와 악센트를 무시할 가능성이 높습니다. Collation을 변경해야합니다.

  • Latin1_General_CI_AI 케이스와 악센트를 무시합니다
  • Latin1_General_CI_AS 악센트를 무시하지 않습니다

SQL Server Collation 이름 목록 여기.

다른 팁

userID의 쿼리 그룹도 - 당신은 그렇게하고 싶지 않습니다.

사용:

SELECT COUNT(*) as NumberOfUsers, UserName 
    FROM Users 
    GROUP BY UserName 
    ORDER BY UserName

쿼리는 동일한 이름과 동일한 사용자 ID를 가진 사용자 만 나타납니다. 또는 데이터를 주문할 수도 있습니다 COUNT(*) 그래서 마지막으로 나타나는 행은 아마도 문제를 제기 할 가능성이 높습니까?

다른 사람들이 제안한 것처럼 Collation에 문제가있을 수 있지만 일반적으로 그룹은 일관성이 있습니다.

아마도 userID가 당신의 주요 키 일 것입니다. 당신이 그룹화하는 것의 일부이므로 그룹당 단일 행을 얻을 수 있습니다. 그룹에서 "userID"열을 꺼내십시오.

Andrew Barrett이 말했듯이 MySQL의 기본 콜레이션은 악센트를 올바르게 인식하지 못합니다.

필드의 충돌을 변경하십시오 UTF8_unicode_ci 그리고 악센트가 올바르게 보일 것입니다.

CI는 사례 둔감을 의미하며 사례가 중요한 경우 다른 콜레이션을 사용할 수 있습니다.

새 Collation을 사용하여 새 테이블을 만든 다음 기존 테이블에서 새 테이블을 새 테이블로 복사 할 수 있습니다.

또한 서버의 넓은 대신 관련 콜레이션에 관심이있는 테이블 만 만들 수 있으므로 다음과 같은 작업을 수행 할 수도 있습니다.

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top