Domanda

Sto avendo una tabella (una tabella esistente con dati al suo interno) e quella tabella ha una colonna UserName. Voglio che questo UserName sia unico. Quindi aggiungo un vincolo come questo:

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

Ora continuo a ricevere l'errore che esistono utenti duplicati in questa tabella. Ma ho controllato il database usando la seguente query:

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

Ciò si traduce in un elenco di utenti che hanno tutti 1 come NumberOfUsers. Quindi nessun duplicato lì. Ma quando controllo lo username non riesce vedo il seguente risultato:

beluga
béluga

In modo così evidente che non riesce a confrontare un " e " e " é " o " è " ... È come se li ignorasse, c'è un modo in cui sql non ignora questi accenti quando aggiunge la chiave unica di contrasto.

SOLUZIONE:

Grazie a voi ragazzi ho trovato la soluzione. Ciò ha risolto il problema:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
È stato utile?

Soluzione

Le regole di confronto che stai utilizzando molto probabilmente ignorano il caso e gli accenti durante il confronto. Dovrai cambiare le regole di confronto.

  • Latin1_General_CI_AI Ignora il caso e gli accenti
  • Latin1_General_CI_AS non ignorerà gli accenti

Elenco dei nomi delle regole di confronto del server SQL qui .

Altri suggerimenti

Anche i tuoi gruppi di query per UserID - non vuoi farlo.

Usa:

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

La tua query mostrerebbe solo utenti con lo stesso nome e lo stesso ID utente. O, forse, ordina i dati per COUNT (*) in modo che l'ultima riga visualizzata sia molto probabilmente il piantagrane?

Potresti anche avere problemi con le regole di confronto come altri hanno suggerito, ma normalmente GROUP BY sarebbe autoconsistente.

Presumibilmente UserId è la tua chiave primaria. Poiché fa parte di ciò che stai raggruppando, hai la garanzia di ottenere una singola riga per gruppo. Prendi il " userId " colonna fuori dal tuo gruppo di.

Come dice Andrew Barrett, le regole di confronto predefinite in MySQL non riconoscono correttamente gli accenti.

Cambia le regole di confronto dei tuoi campi in UTF8_unicode_ci e dovrebbe vedere correttamente gli accenti.

ci significa senza distinzione tra maiuscole e minuscole e puoi utilizzare una diversa fascicolazione se il caso è importante.

Puoi creare una nuova tabella con le nuove regole di confronto, quindi copiare * dalla tabella esistente in quella nuova.

Nota anche che puoi anche creare solo la tabella che ti interessa per le regole di confronto pertinenti (anziché a livello di server). Quindi puoi anche fare qualcosa del tipo:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top