Question

J'ai une table (une table existante avec des données) et cette table a une colonne Nom d'utilisateur. Je veux que ce nom d'utilisateur soit unique. J'ajoute donc une contrainte comme celle-ci:

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

Maintenant, je continue à avoir l’erreur que des utilisateurs en double existent dans ce tableau. Mais j'ai vérifié la base de données en utilisant la requête suivante:

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

Cela se traduit par une liste d'utilisateurs ayant tous 1 comme NumberOfUsers. Donc, pas de doublons là-bas. Mais lorsque je vérifie le nom d'utilisateur, il échoue et je vois le résultat suivant:

beluga
béluga

Il semble donc qu’il ne parvient pas à comparer un "e"; et " & # 233; " ou " & # 232; " ... C’est comme s’il les ignorait. Y at-il un moyen pour que SQL n’ignore pas ces accents lorsqu’il ajoute la clé unique unique?

SOLUTION:

Merci pour vous les gars, j'ai trouvé la solution. Cela a résolu le problème:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
Était-ce utile?

La solution

Le classement que vous utilisez ne tient probablement pas compte de la casse ni des accents lors de la comparaison. Vous devrez modifier le classement.

  • Latin1_General_CI_AI Ignore la casse et les accents
  • Latin1_General_CI_AS n'ignorera pas les accents

Liste des noms des classements du serveur SQL ici .

Autres conseils

Votre groupe de requêtes dépend également de l'ID utilisateur. Vous ne voulez pas le faire.

Utiliser:

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

Votre requête n'affichera que les utilisateurs portant le même nom et le même identifiant. Ou alors, peut-être, classer les données par COUNT (*) afin que la dernière ligne affichée soit probablement le fauteur de troubles?

Vous pouvez également rencontrer des problèmes de classement, comme d'autres l'ont suggéré, mais normalement, GROUP BY serait cohérent.

On peut supposer que UserId est votre clé primaire. Étant donné que cela fait partie de ce que vous regroupez, vous êtes assuré d'obtenir une seule ligne par groupe. Prenez le " userId " colonne de votre groupe par.

Comme Andrew Barrett le dit, le classement par défaut dans MySQL ne reconnaît pas correctement les accents.

Modifiez le classement de vos champs en UTF8_unicode_ci afin que les accents soient correctement visibles.

ci signifie que la casse est respectée et vous pouvez utiliser un classement différent si la casse est importante.

Vous pouvez créer une nouvelle table avec le nouveau classement, puis copier * de la table existante dans la nouvelle.

Notez également que vous pouvez également créer uniquement la table qui vous intéresse dans le classement pertinent (au lieu de l’ensemble du serveur). Ainsi, vous pouvez également procéder de la manière suivante:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top