Pergunta

Eu estou tendo uma tabela (uma tabela existente com dados nele) e que a tabela tem um nome de usuário coluna. Quero este nome de usuário para ser único. Então eu adicionar uma restrição como esta:

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

Agora eu continuo recebendo o erro que existem usuários duplicados na tabela. Mas eu verifiquei o banco de dados usando a seguinte consulta:

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

Isso resulta em uma lista de todos os usuários que têm 1 como um NumberOfUsers. Portanto, não duplica lá. Mas quando eu estou verificando o nome de usuário que não vejo o seguinte resultado:

beluga
béluga

Assim apperently ele não consegue comparar um "e" e "e" ou "E" ... É como se ele ignora estes, existe alguma maneira que o SQL não ignorar esses acentos ao adicionar o contraint chave única.

SOLUÇÃO:

THX para vocês que eu encontrei a solução. Isso resolveu o problema:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Foi útil?

Solução

O agrupamento que você está usando provavelmente ignora caso e acentos ao comparar. Você precisará alterar o agrupamento.

  • Latin1_General_CI_AI caso ignora e acentos
  • Latin1_General_CI_AS não vai ignorar acentos

Lista de nomes de agrupamento do SQL Server aqui .

Outras dicas

Seus grupos de consulta por UserID também - você não quer estar fazendo isso

.

Use:

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

A sua consulta só iria aparecer usuários com o mesmo nome e mesma ID do usuário. Ou, talvez, a ordem dos dados por COUNT(*) assim a última linha que aparece é mais provável que o encrenqueiro?

Você também pode ter problemas com agrupamento como já foi sugerido, mas normalmente, GROUP BY seria auto-consistente.

Presumivelmente UserId é a chave primária. Desde a sua parte do que você está agrupando por, você está garantido para obter uma única linha por grupo. Tome a coluna "userId" fora de seu grupo.

Como Andrew Barrett diz, o agrupamento padrão no MySQL doesn não reconhece acentos corretamente.

Alterar o agrupamento de seus campos para UTF8_unicode_ci e ele deve ver acentos corretamente.

meios ci maiúsculas e minúsculas, e você pode usar um agrupamento diferente, se caso é importante.

Você pode criar uma nova tabela com o novo agrupamento, em seguida, copiar * da tabela existente para o novo.

Além disso, note que você também pode criar apenas a tabela que você está interessado no agrupamento relevent (em vez de servidor de largura) .Assim você também pode fazer algo como:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top