2009-04-21 42 views
10

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 guidelinesVisual 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?

Trả lời

3

Để trả lời câu hỏi đầu tiên của bạn, có Microsoft có chút không nhất quán. Để trả lời câu hỏi thứ hai của bạn, không chuyển đổi bất cứ điều gì cho đến khi bạn xác nhận rằng điều này đang gây ra một nút cổ chai trong ứng dụng của bạn.

Hãy suy nghĩ xem bạn có thể thực hiện bao nhiêu tiến bộ về dự án thay vì lãng phí thời gian chuyển đổi mọi thứ. Thời gian phát triển của bạn có giá trị hơn nhiều so với số tiền tiết kiệm bạn sẽ nhận được từ sự thay đổi đó.

Hãy nhớ rằng:

sớm tối ưu hóa là gốc rễ của mọi tội lỗi (hoặc ít nhất nhất của nó) trong lập trình. - Donald Knuth

+0

Đâ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ỳ). –

+2

@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: ( –

6

Theo CA1308, lý do để làm điều này là một số ký tự không thể chuyển đổi từ trên xuống dưới. Điều quan trọng là bạn luôn di chuyển theo một hướng, vì vậy nếu tiêu chuẩn của bạn là luôn luôn chuyển sang trường hợp thấp hơn thì không có lý do gì để thay đổi nó.

+4

Tôi thích phương pháp này. tiêu chuẩn luôn luôn là thực hành tốt nhất trong ánh sáng của không có động lực khác để làm khác, nhưng khi làm việc trên bảo trì hiện có, nó thường là điên rồ chỉ để chuyển đổi bởi vì nó nói như vậy.Bạn cần bằng chứng thuyết phục rằng dự án của bạn sẽ được hưởng lợi từ sự thay đổi trước khi bắt tay vào như vậy –

+0

Tôi hoàn toàn đồng ý, Jeff, có một số hướng dẫn mà bạn nên làm theo và tôi sẽ nói có thể có giá trị nâng cấp mã hiện có để làm theo (chắc chắn rằng bạn vứt bỏ trình đọc dữ liệu của bạn cho Tuy nhiên, điều này không phải là một trong những quy tắc đó cũng không phải là một trong những quy tắc đó thậm chí còn gần gũi. – JoshBerke

-2

Tiếp tục sử dụng bình thường hóa chữ thường. Chỉ thay đổi để phù hợp với các tiêu chuẩn của Microsoft nếu một vấn đề lớn phát triển.

Điều này thật đáng tiếc nhưng đáng giá. Đáng buồn thay, Microsoft "tiêu chuẩn" có xu hướng được xem xét kém và phần nào ít hơn nhất quán; kinh nghiệm với họ đã cho thấy rằng trừ khi có một lý do thuyết phục, tốt nhất là chỉ cần gắn bó với những gì làm việc trong khi nó hoạt động. Lưu ý rằng điều này thường KHÔNG đúng với các công nghệ không phải của Microsoft; nhưng sự tùy tiện của "tiêu chuẩn" của Microsoft khiến họ đáng để tránh.

Chỉnh sửa: Tôi nên làm rõ ở đây; ý kiến ​​của tôi về Microsoft là rất thấp, từ kinh nghiệm lâu năm với tiêu chuẩn của họ. Như đã được chỉ ra trong các ý kiến, tôi không có tài liệu tham khảo cụ thể để chỉ ra về "tất cả mọi người khác ngoài Microsoft"; điều này xuất phát từ kinh nghiệm cá nhân của tôi. Mileage của bạn có thể thay đổi rộng rãi. Câu trả lời này nên được xem xét thực sự chỉ là ý kiến ​​của tôi. Xin lỗi vì đã không làm rõ hơn trước đó.

+5

Tôi nghĩ bạn cần trích dẫn một số nguồn trước khi đưa ra tuyên bố về "tất cả mọi người trừ Mi crosoft "khi nói đến tiêu chuẩn. Trong những năm gần đây, Microsoft dường như rất cẩn thận trong việc nghiên cứu các động lực đằng sau các tiêu chuẩn của họ và trong khi việc thực hiện các tiêu chuẩn web trong IE vẫn còn rất lý tưởng, các tiêu chuẩn mà chúng xác định cho chúng tôi hoạt động trong các sản phẩm của họ thường rất tuyệt vời. Xin vui lòng, sao lưu báo cáo của bạn, vì sợ rằng họ được hiểu là ý kiến ​​cay đắng. –

+3

Tôi đồng ý với Jeff, tiêu chuẩn của họ rất nhất quán khi áp dụng các tiêu chuẩn của họ ít hơn nhưng điều này được mong đợi, mã được viết trước tiêu chuẩn được chấp nhận sẽ không được cập nhật chỉ để đưa nó vào tuân thủ, Hãy tưởng tượng nếu họ thay đổi tất cả không gian tên của họ để phản ánh cách tiếp cận mới của họ để chọn không gian tên và tất cả các nhà phát triển sẽ hét lên giết người đẫm máu. – JoshBerke

+0

Điểm của bạn đều tốt; vị trí của tôi trên thực tế đến từ nhiều ý kiến ​​cay đắng và rất nhiều và rất nhiều kinh nghiệm crappy với Microsoft. Tôi sẽ cập nhật để phản ánh điều đó. –

Các vấn đề liên quan