Tại sao trộn các đối chiếu cột trong một cơ sở dữ liệu duy nhất được coi là xấu?


11

Có hai lý do khiến tôi phải đặt câu hỏi này:

tQueryt
Khung thử nghiệm T-SQL tQueryt coi đó là vấn đề "Mức độ nghiêm trọng cao" khi tồn tại các cột có đối chiếu không mặc định. Tác giả của bài kiểm tra nói như sau:

Tôi KHÔNG gợi ý rằng mỗi cột chuỗi nên có đối chiếu khớp với đối chiếu mặc định cho cơ sở dữ liệu. Thay vào đó, tôi đề nghị rằng khi nó khác đi, nên có một lý do chính đáng cho nó.

Tuy nhiên, mức độ nghiêm trọng của thử nghiệm thất bại, như đã đề cập, được coi là cao.

Triển khai Octopus
Trong khi định cấu hình Máy chủ triển khai Octopus, thiết lập không thành công với lỗi FATAL trong quá trình khởi tạo phiên bản OctopusServer. Các bài viết liên quan đến lỗi nhắn không giải thích lý do tại sao đây là một yêu cầu, mà chỉ đơn giản nói rằng nó sẽ là một yêu cầu cho các triển khai trong tương lai, từ và bao gồm Octopus phiên bản 3.8.

Là một lưu ý phụ, gói công cụ CI của RedGate, Bộ tự động hóa DLM , hỗ trợ triển khai với các đối chiếu khác nhau mà không có khiếu nại.

Đề xuất giữ tất cả các đối chiếu cột vào cơ sở dữ liệu mặc định có vẻ giống như hướng dẫn hoặc thực tiễn tốt nhất đối với tôi. Tại sao nó được coi là một lỗi nghiêm trọng như vậy bởi một số?


Bạn đang đề cập đến các phiên bản tQueryt của các bài kiểm tra SQL Cop. Khi các bài kiểm tra tQueryt vượt qua hoặc thất bại, chúng phải cung cấp một mặc định được đề xuất. Người dùng được mong đợi hoàn toàn thích ứng các thử nghiệm SQLCop theo yêu cầu của riêng họ vì chúng không hơn các thủ tục được lưu trữ trong lược đồ SQLCop được chọn bởi khung tQueryt.
David Atkinson

Câu trả lời:


19

Đề xuất giữ tất cả các đối chiếu cột vào cơ sở dữ liệu mặc định có vẻ giống như hướng dẫn hoặc thực tiễn tốt nhất đối với tôi.

Bạn hoàn toàn chính xác ở đây.

Tại sao nó được coi là một lỗi nghiêm trọng như vậy bởi một số?

Vì lý do tương tự mà bạn sẽ thường nghe / đọc rằng "bạn không bao giờ nên sử dụng:"

  • HIỆN TẠI
  • GOTO các câu lệnh
  • SQLCLR
  • WITH (NOLOCK)
  • vân vân, vân vân

Một số tính năng / tùy chọn / công nghệ phức tạp hơn các tính năng khác và thường đòi hỏi nhiều kiến ​​thức hơn bởi người dùng vì khả năng gặp rắc rối khi sử dụng nó lớn hơn nhiều so với khả năng không gặp vấn đề gì. Vì vậy, sẽ dễ dàng hơn để có các quy tắc tổng quát chống lại những điều như vậy cho dân số nói chung. Trên thực tế, khi viết lên "Tiêu chuẩn mã hóa" tại nơi làm việc, tôi sẽ luôn có một quy tắc là không bao giờsử dụng HIỆN TẠI, nhưng tôi tự sử dụng chúng vì tôi biết cả "khi nào" để sử dụng chúng và "cách" sử dụng chúng một cách hiệu quả. Nhưng những người chỉ thỉnh thoảng viết các truy vấn không nên mong đợi để biết điều đó. Điều này cũng tương tự như "không chỉnh sửa Sổ đăng ký trừ khi bạn hoàn toàn biết bạn đang làm gì" hoặc các quy tắc mà chúng tôi đưa ra với tư cách là cha mẹ cho những đứa trẻ (rất nhỏ) của chúng tôi, nơi chúng tôi cần bảo chúng đừng làm điều gì đó đơn giản vì chúng là không có khả năng vượt qua sự phức tạp của thời điểm nào là ổn để làm một việc cụ thể hoặc làm thế nào để thực hiện nó.

Trong trường hợp Collations, đây là một chủ đề rất phức tạp và khó hiểu và bạn có thể gặp cả hai lỗi cứng (đây là một vấn đề nhưng ít xảy ra sự cố vì chúng rõ ràng và do đó đủ dễ sửa) và thành "lẻ" hành vi khó giải thích tại sao mọi thứ lại hoạt động theo cách của chúng (tại sao một số mặt hàng được lọc hoặc không được lọc, ngoài mong đợi, HOẶC tại sao sắp xếp lại hoạt động ngoài mong đợi). Và đáng buồn thay, dường như có một số lượng lớn thông tin sai lệch trôi nổi xung quanh mà làm xáo trộn sự nhầm lẫn hàng loạt. Tôi thực sự đang làm việc trong một dự án để tăng đáng kể kiến ​​thức chung về Collations và mã hóa, v.v.

Đối với Collation, bạn cần sử dụng những gì có ý nghĩa nhất cho trường hợp kinh doanh. Khái niệm không trộn Collations trong bảng hoặc cơ sở dữ liệu là một cách tiếp cận mặc định, nhưng nếu bạn nhìn vào Collations được sử dụng cho các cột khác nhau của các khung nhìn danh mục hệ thống, bạn sẽ thấy nhiều Collations được sử dụng. Vì vậy, tôi đồng ý với trích dẫn chính trong câu hỏi NẾU Bộ sưu tập sẽ khác đi, nó nên có chủ ý, nhưng không có gì sai với nó.


Về điều này từ câu hỏi (nhấn mạnh thêm):

Trong khi định cấu hình Máy chủ triển khai Octopus, thiết lập không thành công với lỗi FATAL trong quá trình khởi tạo phiên bản OctopusServer. Bài viết liên quan đến thông báo lỗi không giải thích tại sao đây là một yêu cầu

Tôi đã kiểm tra trang tài liệu được liên kết và nó thực sự giải thích tại sao nó là một yêu cầu. Tôi đã sao chép thông tin thích hợp từ tài liệu đó bên dưới:

Bạn phải đảm bảo bạn cũng thay đổi đối chiếu tất cả các đối tượng trong Cơ sở dữ liệu Octopus, nếu không, có thể xảy ra lỗi khi sửa đổi cơ sở dữ liệu trong quá trình nâng cấp phiên bản Octopus. Các đối tượng mới được tạo sẽ sử dụng đối chiếu được cập nhật và khi cố gắng (ví dụ) thực hiện các phép nối SQL giữa các đối tượng này và các đối tượng hiện có bằng cách sử dụng đối chiếu ban đầu, có thể xảy ra lỗi đối chiếu sai đối chiếu.

Họ đang nói rằng mã của họ, trong cơ sở dữ liệu Octopus, có THAM GIA giữa các cột chuỗi và có thể có mã mới được giới thiệu trong bản nâng cấp trong tương lai có THAM GIA bổ sung trên các cột chuỗi mới . Các cột mới, thông qua CREATE TABLEhoặc ALTER TABLE ... ADD, sẽ được chỉ định Đối chiếu cơ sở dữ liệu mặc định nếuCOLLATEtừ khóa không được chỉ định cho (các) cột chuỗi mới. Và THAM GIA giữa các cột chuỗi không có Collation giống nhau sẽ tạo ra lỗi không khớp Collation. Họ dường như cũng cho phép người dùng chọn Collation của riêng họ (có thể phù hợp với các địa phương khác nhau) vì họ nói rằng yêu cầu duy nhất là Collation không phân biệt chữ hoa chữ thường. Và vì Collation của cơ sở dữ liệu mà mã của họ tồn tại không được đảm bảo giống nhau, nên họ không thể sử dụng COLLATEtừ khóa để buộc Collation giống nhau trên tất cả các cột chuỗi mới (tốt, về mặt kỹ thuật có thể, nhưng điều đó đòi hỏi phải có Động SQL không dễ đối phó khi tạo tập lệnh cập nhật). Nếu họ có thể sử dụng COLLATEtừ khóa, thì họ có thểtránh xa việc đối chiếu mặc định của Cơ sở dữ liệu khác với các cột chuỗi. Điều đó sẽ tránh được các lỗi "Collation không khớp" cứng, nhưng vẫn để ngỏ khả năng các hoạt động so sánh liên quan đến một trong các cột chuỗi đó và một chuỗi ký tự hoặc biến chuỗi dẫn đến hành vi "lẻ" vì nó sẽ sử dụng Collation của cột chứ không phải của Cơ sở dữ liệu Đối chiếu. Tất nhiên, đó rất có thể là hành vi được mong đợi. Nhưng vì đây là ứng dụng của bên thứ 3, nên hành vi phải là những gì họ dự định thay vì cơ hội 50/50 giữa a) những gì người dùng muốn (hoặc không phản đối) và b) những gì người dùng coi là lỗi (và sau đó lãng phí thời gian hỗ trợ của nhà cung cấp cho một cuộc rượt đuổi ngông cuồng và / hoặc blog về cách phần mềm của họ bị lỗi).


này, có tin tức gì về dự án đó về Collations không?
Yaroslav

10

Trên một câu ngắn: THU THẬP xác định sắp xếp và so sánh .

Vì vậy, đối chiếu xác định các quy tắc SQL Server sử dụng để so sánh và sắp xếp dữ liệu ký tự. Các quy tắc này là nhận thức ngôn ngữ / ngôn ngữ và cũng có thể nhạy cảm với trường hợp, giọng nói, Kana và chiều rộng. Hậu tố đối chiếu xác định độ nhạy của quy tắc từ điển (in): _CS (phân biệt chữ hoa chữ thường), _CI (không phân biệt chữ hoa chữ thường), _AS (phân biệt trọng âm), _AI (không phân biệt trọng âm) và _KS (nhạy cảm với Kana). Đối chiếu nhị phân, được xác định bởi các hậu tố _BIN (nhị phân) và _BIN2 (điểm mã nhị phân), rất nhạy cảm trong tất cả các liên quan.

Các đối chiếu khác nhau chắc chắn sẽ yêu cầu cách giải quyết để tránh các lỗi "không thể giải quyết xung đột đối chiếu" và có thể giết chết hiệu suất do các biểu thức không thể nói được . Đối phó với các va chạm khác nhau có thể là một cơn ác mộng (đã từng ở đó) vì vậy đó là lý do tại sao nên chọn một và gắn bó với nó.

Tham khảo thêm:


1

Như với nhiều thứ, trong các phiên bản trước của SQL, nó có thể gây ra các vấn đề khá quan trọng. Xem bài viết này từ SQL7 / 2000

Đối chiếu SqlServerCentral

Bây giờ nó mạnh mẽ hơn nhiều, và có những tình huống mà nó được chứng minh trong các hệ thống hiện đại hơn, nhưng vẫn còn một số cảnh báo khá thú vị để thay đổi nó.

Đây là một loạt hữu ích trên các phiên bản hiện đại hơn. Bởi Dan Guzman, người mà tôi tin rằng các bài đăng trên đây thường xuyên để anh ta có thể sớm lên kế hoạch :)

Địa ngục đối chiếu SQL

Tóm lại, khả năng tương thích, tiêu chuẩn hóa và hiệu suất tiềm năng là những lý do chính không sử dụng đối chiếu hỗn hợp.


0

Truyền dữ liệu giữa các lần đối chiếu có thể thay đổi dữ liệu nếu đó là char (văn bản 8 bit) thay vì nchar (16 bit).

Tôi tin từ trang này https://the.agilesql.club/bloss/Blogs/Ed-Elliott/What-collation-variables-take-on-inT-Query rằng khi một biến được gán với văn bản từ bảng, thì đó là ngầm dịch sang / được coi là đối chiếu của cơ sở dữ liệu hiện tại. Nhưng điều gì xảy ra với văn bản trong biến khi bạn chuyển sang cơ sở dữ liệu khác? Các byte đó có được dịch lại (nếu cần) sang đối chiếu mới không?

Tôi đã chọn một thủ thuật đối chiếu để loại bỏ dấu "Latin" và chỉ để lại văn bản ASCII, điều tôi cần vì phần mềm bên thứ ba của chúng tôi bị nghẹt các dấu - Tôi đặt văn bản vào một đối chiếu chỉ chứa ASCII và bảng chữ cái Hy Lạp hiện đại; Collate SQL_Latin1_General_CP1253_CI_AI. "Slán" để nhấn vào các chữ cái La Mã! ;-)

Nhưng tin xấu nếu tôi muốn giữ chúng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.