2010-06-07 30 views
8

Một số lý do để chọn trường hợp trùng lặp nhạy cảm trong trường hợp không phân biệt chữ hoa chữ thường là gì? Tôi có thể thấy có lẽ đạt được hiệu suất khiêm tốn cho động cơ DB khi so sánh chuỗi. Là nó? Nếu dữ liệu của bạn được đặt thành tất cả chữ thường hoặc chữ hoa thì trường hợp nhạy cảm có thể hợp lý nhưng đó là một thảm họa nếu bạn lưu trữ dữ liệu hỗn hợp và sau đó thử truy vấn nó. Sau đó, bạn phải áp dụng hàm lower() trên cột sao cho nó sẽ khớp với chuỗi chữ thường thấp hơn tương ứng. Điều này ngăn cản việc sử dụng chỉ mục trong mọi dbms mà tôi đã sử dụng. Vì vậy, tự hỏi tại sao bất cứ ai sẽ sử dụng một lựa chọn như vậy.Tại sao bạn muốn một cơ sở dữ liệu nhạy cảm?

Trả lời

9

Có rất nhiều ví dụ về dữ liệu với các phím được tự nhiên trường hợp nhạy cảm:

  • tập tin trong một hệ thống tập tin nhạy cảm như trường hợp Unix.
  • Tên mã hóa Base-64 (mà tôi tin là những gì YouTube đang sử dụng, như trong câu trả lời của Artelius).
  • Ký hiệu bằng hầu hết các ngôn ngữ lập trình.

Lưu trữ dữ liệu nhạy cảm trong trường hợp trong hệ thống không phân biệt chữ hoa chữ thường làm mất dữ liệu không nhất quán hoặc thậm chí mất thông tin quan trọng. Lưu trữ dữ liệu không phân biệt chữ hoa chữ thường trong một hệ thống phân biệt chữ hoa chữ thường, ít nhất là không hiệu quả. Như bạn chỉ ra, nếu bạn chỉ biết tên case-insensitive của một đối tượng bạn đang tìm kiếm, bạn cần phải điều chỉnh truy vấn của bạn:

SELECT * FROM t WHERE LOWER(name) = 'something'; 

tôi lưu ý rằng trong PostgreSQL (và có lẽ trong các hệ thống khác), nó là một vấn đề đơn giản để tạo ra một chỉ mục trên biểu thức LOWER(name) sẽ được sử dụng trong các truy vấn như vậy.

+1

Chỉ mục về biểu thức là loại pokey mặc dù trong PostgreSQL phải không? Tuy nhiên nó vẫn còn tốt hơn nhiều so với những gì tôi đã thấy trong MySQL khi gặp phải vấn đề này - cố gắng kết hợp với các địa chỉ email chẳng hạn. Chúng tôi đang vặn vẹo vì độ nhạy trường hợp - quét bảng trên mọi truy vấn. Tất nhiên những kẻ duy trì cơ sở dữ liệu đó có thể đã hạ thấp tất cả các chuỗi nhưng họ đã không và sẽ không và có hàng triệu người trong số họ nên ugh. Chúng tôi đã giải quyết nó bằng cách sao chép bảng và chuyển nó sang phân biệt chữ hoa chữ thường. – Khorkrak

+0

Các chỉ mục trên biểu thức có một số hạn chế (ví dụ: yêu cầu một biểu thức không thay đổi) và tôi đoán chúng không hoàn toàn hiệu quả như các chỉ mục đơn giản. Nhưng chúng hoạt động khá tốt trong trường hợp này. Điều duy nhất là nhớ cách cụm từ truy vấn để làm việc với nó: bạn cần biểu thức chỉ mục chính xác trong truy vấn của bạn ở đâu đó. – Edmund

2

Phụ thuộc vào dữ liệu bạn muốn lưu trữ. Hầu hết các hệ thống tập tin UNIX là các cơ sở dữ liệu với các khóa nhạy cảm. Các video trên YouTube dường như được sắp xếp bằng các phím nhạy cảm với chữ hoa chữ thường.

Hầu hết thời gian bạn muốn tìm kiếm phân biệt chữ hoa chữ thường, nhưng rõ ràng có một số ngoại lệ nhất định.

1

Sử dụng chỉ mục không phân biệt chữ hoa chữ thường cho trường của bạn. Trong hầu hết các trường hợp, bạn không muốn thao tác dữ liệu để tìm nó.

+0

hmm thật thú vị. Có một điều như vậy trong MySQL hay đây là một lý do khác để chuyển sang một cơ sở dữ liệu thực sự như PostgreSQL? – Khorkrak

+0

Tôi không sử dụng MySQL, nhưng tôi đã thực hiện một số tìm kiếm. Bạn đã chạm vào nó ... Collations: http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html –

+0

Phải nhưng việc ép buộc đối chiếu cũng làm cho các chỉ mục vô dụng trong MySQL cho các cột liên quan bởi vì động cơ phải áp dụng công tắc đối chiếu trên mỗi hàng trước khi thực hiện để so sánh. Đã thử rằng một đã :) – Khorkrak

0

Một lý do là quản lý nội dung. Thông thường, bạn sẽ cần phải xác định những thay đổi trong nội dung để những thay đổi đó có thể được xem xét, ghi lại và xuất bản. Trường hợp quan trọng đối với nội dung có thể đọc được của con người. "Dave Doe" là chính xác. "dave doe" là đồng bằng sai.

Trường hợp nhạy cảm cũng quan trọng đối với nhà phát triển phần mềm. Nếu bạn không biết độ nhạy trường hợp mong muốn cho tất cả các hệ thống của khách hàng của bạn thì bạn có thể muốn kiểm tra trường hợp-senstivity như là một phần của thử nghiệm anyway.

0

Tôi đã làm việc trên một ứng dụng liên quan đến cơ sở dữ liệu với các khóa hoàn toàn tự nhiên (tức là 'mã') mà nên phân biệt chữ hoa chữ thường nhưng không nhất thiết phải như vậy.

Rất nhiều dữ liệu sẽ xuất phát từ cơ sở dữ liệu trong các procs được lưu trữ (với cơ sở dữ liệu đang thực hiện các phép nối), trong đó độ nhạy trường hợp không phải là vấn đề. Tuy nhiên, một số dữ liệu cần thiết đến từ cơ sở dữ liệu trong các truy vấn riêng biệt và sau đó được 'ghép lại với nhau' trong các vòng - chủ yếu là do một kiểu dữ liệu phức tạp mà SQL không thể làm việc dễ dàng - và đây là nơi vấn đề nảy sinh. Khi tôi đang lặp lại hai tập hợp kết quả và cố gắng tham gia vào 'mã', các giá trị ProductcodeProductCode không khớp với nhau một cách tự nhiên.

Thay vì sửa dữ liệu, tôi phải thay đổi mã của mình (C#) để thực hiện khớp chuỗi không phân biệt chữ hoa chữ thường. Không phải trong suốt toàn bộ giải pháp, tâm trí, chỉ khi nhìn qua các 'mã' này cho phù hợp.

Nếu tôi có cơ sở dữ liệu nhạy cảm, tôi sẽ có mã gọn hơn.

Bây giờ, thay vì 'tại sao phân biệt chữ hoa chữ thường', tôi thực sự muốn biết lý do bạn muốn có cơ sở dữ liệu không phân biệt chữ hoa chữ thường. Có phải do lười biếng? Tôi không thấy bất kỳ lý do chính đáng nào mà cơ sở dữ liệu không phân biệt chữ hoa chữ thường.

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