Attualmente sto memorizzando versioni normalizzate di stringhe nel mio database SQL Server in minuscolo. Ad esempio, nella mia tabella Utenti, ho un campo UserName e LoweredUserName. A seconda del contesto, uso la funzione LOWER() di T-SQL o il metodo String.ToLower() di C# per generare la versione minuscola del nome utente per riempire il campo LoweredUserName. Secondo Microsoft's guidelines e Visual Studio's code analysis rule CA1308, dovrei usare C#. String.ToUpperInvariant() invece di ToLower(). Secondo Microsoft, si tratta di un problema di prestazioni e di globalizzazione: la conversione in maiuscolo è sicura, mentre la conversione in minuscolo può causare una perdita di informazioni (ad esempio, the Turkish 'I' problem).Normalizzazione delle stringhe con String.ToUpperInvariant()
Se passo a utilizzare ToUpperInvariant per la normalizzazione delle stringhe, dovrò cambiare anche lo schema del mio database, poiché il mio schema si basa sul framework Microsoft's ASP.NET Membership (vedi this related question), che normalizza le stringhe in minuscolo.
Microsoft non contraddice se stesso dicendoci di utilizzare la normalizzazione maiuscola in C#, mentre il proprio codice nelle tabelle Membership e le procedure utilizzano la normalizzazione in minuscolo? Devo passare tutto alla normalizzazione delle maiuscole o continuare semplicemente usando la normalizzazione in minuscolo?
Questo non è solo un problema di prestazioni, è anche un problema di globalizzazione. Secondo Microsoft, la conversione in maiuscolo è sicura, mentre la conversione in minuscolo può causare una perdita di informazioni (ad esempio, nel problema turco "I"). –
@Kevin, il problema I senza macchia turco/azero rimane un caso speciale a prescindere dall'approccio (sono maiuscoli i a İ e ı a I), sebbene il minuscolo sia ambiguo per SS (dovrebbe essere ss o ß) ma anche imperfetto (alcune ortografie sono ancora in maiuscolo ß in SZ). È ancora meglio però. Meglio ancora usare le regole di piegatura delle maiuscole Unicode con un interruttore Turkic per i e ı, ma non sarà ancora perfetto, che può essere solo per locale :( –