Actualmente estoy almacenando versiones normalizadas de cadenas en mi base de datos de SQL Server en minúsculas. Por ejemplo, en mi tabla de usuarios, tengo un nombre de usuario y un campo LoweredUserName. Dependiendo del contexto, utilizo la función LOWER() de T-SQL o el método String.ToLower() de C# para generar la versión en minúscula del nombre de usuario para llenar el campo LoweredUserName. De acuerdo con Microsoft's guidelines y Visual Studio's code analysis rule CA1308, debería estar utilizando C# 's String.ToUpperInvariant() en lugar de ToLower(). Según Microsoft, este es un problema tanto de rendimiento como de globalización: la conversión a mayúsculas es segura, mientras que la conversión a minúsculas puede causar una pérdida de información (por ejemplo, the Turkish 'I' problem).Normalización de cadenas con String.ToUpperInvariant()
Si paso al uso de ToUpperInvariant para la normalización de cadenas, también tendré que cambiar el esquema de la base de datos, ya que mi esquema se basa en el marco Microsoft's ASP.NET Membership (ver this related question), que normaliza cadenas a minúsculas.
¿No se contradice Microsoft diciéndonos que usemos la normalización en mayúscula en C#, mientras que su propio código en las tablas y procedimientos de membresía está utilizando la normalización en minúsculas? ¿Debo cambiar todo a la normalización en mayúscula o simplemente continuar usando la normalización en minúsculas?
Esto no es solo un problema de rendimiento, también es un problema de globalización. Según Microsoft, la conversión a mayúsculas es segura, mientras que la conversión a minúsculas puede causar una pérdida de información (por ejemplo, en el problema turco 'I'). –
@Kevin, el problema turco/azerí sin puntos I sigue siendo un caso especial cualquiera que sea el enfoque utilizado (mayúscula i a İ y yo a I), aunque la minúscula es ambigua para SS (debería ser ss o ß) pero eso también es imperfecto (algunas ortografías todavía mayúsculas ß a SZ). Aún así es mejor. Mejor aún es usar las reglas de plegado de mayúsculas y minúsculas de Unicode con un interruptor de Turkic para i e ı, pero aún así no será perfecto, eso solo puede ser por configuración regional :( –