Tôi hiện đang lưu trữ các phiên bản chuẩn hóa của chuỗi trong cơ sở dữ liệu SQL Server của mình trong trường hợp thấp hơn. Ví dụ, trong bảng Người dùng của tôi, tôi có một trường UserName và LoweredUserName. Tùy thuộc vào ngữ cảnh, tôi hoặc sử dụng hàm LOWER() của T-SQL hoặc phương thức String.ToLower() của C# để tạo ra phiên bản trường hợp thấp hơn của tên người dùng để điền vào trường LoweredUserName. Theo Microsoft's guidelines và Visual Studio's code analysis rule CA1308, tôi nên sử dụng C# 's String.ToUpperInvariant() thay vì ToLower(). Theo Microsoft, đây là cả vấn đề hiệu suất và toàn cầu hoá: chuyển đổi sang chữ hoa thường là an toàn, trong khi chuyển sang chữ thường có thể gây mất thông tin (ví dụ: the Turkish 'I' problem).Chuẩn hóa các chuỗi với chuỗi.ToUpperInvariant()
Nếu tôi chuyển sang sử dụng ToUpperInvariant để chuẩn hóa chuỗi, tôi sẽ phải thay đổi giản đồ cơ sở dữ liệu của mình, vì giản đồ của tôi dựa trên khung Microsoft's ASP.NET Membership (xem this related question).
Microsoft không mâu thuẫn với chính nó bằng cách yêu cầu chúng tôi sử dụng bình thường hóa chữ hoa trong C#, trong khi mã riêng của nó trong bảng thành viên và thủ tục đang sử dụng bình thường hóa chữ thường? Tôi có nên chuyển mọi thứ sang bình thường hóa chữ hoa hay chỉ tiếp tục sử dụng bình thường hóa chữ thường?
Đây không chỉ là vấn đề về hiệu suất, nó còn là vấn đề toàn cầu hóa. Theo Microsoft, việc chuyển đổi sang chữ hoa trên là an toàn, trong khi chuyển đổi sang chữ thường có thể gây mất thông tin (ví dụ, trong vấn đề 'Tôi' của Thổ Nhĩ Kỳ). –
@Kevin, vấn đề của Thổ Nhĩ Kỳ/Azeri dotless tôi vẫn là một trường hợp đặc biệt mà bất kỳ cách nào được sử dụng (chúng viết hoa i đến İ và ı cho tôi), mặc dù giảm là mơ hồ đối với SS (nên là ss hoặc ß) nhưng cũng không hoàn hảo (một số orthographies vẫn chữ hoa to để SZ). Nó vẫn còn tốt hơn mặc dù. Vẫn tốt hơn là sử dụng các quy tắc xếp chữ Unicode với công tắc Turkic cho i và ı, nhưng nó vẫn không hoàn hảo, chỉ có thể cho mỗi miền địa phương: ( –