Pregunta

Tengo una tabla (una tabla existente con datos en ella) y esa tabla tiene una columna UserName. Quiero que este Nombre de usuario sea único. Así que agrego una restricción como esta:

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

Ahora sigo recibiendo el error de que existen usuarios duplicados en esta tabla. Pero he revisado la base de datos utilizando la siguiente consulta:

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

Esto da como resultado una lista de usuarios que tienen 1 como NumberOfUsers. Así que no hay duplicados allí. Pero cuando verifico el nombre de usuario que falla, veo el siguiente resultado:

beluga
béluga

Aparentemente, no puede comparar una " e " y " é " o " è " ... Es como si los ignorara, ¿hay alguna manera de que sql no ignore estos acentos cuando agrega la clave única?

SOLUCIÓN:

THX para ustedes, he encontrado la solución. Esto solucionó el problema:

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

Solución

La intercalación que está utilizando probablemente ignora el caso y los acentos cuando se compara. Tendrás que cambiar la colación.

  • Latin1_General_CI_AI Ignora el caso y los acentos
  • Latin1_General_CI_AS no ignorará los acentos

Lista de nombres de colación de servidores SQL aquí .

Otros consejos

Sus consultas también se agrupan por ID de usuario, no desea hacerlo.

Uso:

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

Su consulta solo mostrará usuarios con el mismo nombre y la misma ID de usuario. O, tal vez, ordene los datos por COUNT (*) de modo que la última fila que aparece sea probablemente la que causa problemas.

También podría tener problemas con la recopilación, como han sugerido otros, pero normalmente, GROUP BY sería coherente.

Presumiblemente UserId es su clave principal. Ya que es parte de lo que está agrupando, tiene la garantía de obtener una sola fila por grupo. Toma el " userId " columna fuera de su grupo por.

Como dice Andrew Barrett, la intercalación predeterminada en MySQL no reconoce los acentos correctamente.

Cambie la intercalación de sus campos a UTF8_unicode_ci y debería ver los acentos correctamente.

ci significa que no distingue entre mayúsculas y minúsculas, y puede usar una intercalación diferente si el caso es importante.

Puede crear una nueva tabla con la nueva intercalación, luego copiar * desde la tabla existente a la nueva.

También tenga en cuenta que también puede crear solo la tabla que le interesa en la intercalación relevante (en lugar de en todo el servidor). También puede hacer algo como:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top