MySQL VARCHAR phân biệt chữ hoa chữ thường

Mức độ trừu tượng cao do Entity Framework cung cấp đôi khi thách thức các nhà phát triển truy cập vào bộ tính năng đầy đủ có sẵn thông qua SQL gốc của một máy chủ cơ sở dữ liệu cụ thể. Trong chủ đề này, chúng tôi sẽ trình bày cách sử dụng đối chiếu trong MySQL để kiểm soát cài đặt phân biệt chữ hoa chữ thường trong các truy vấn do Entity Framework tạo

Đối chiếu xác định một thứ tự thông qua quá trình so sánh hai chuỗi ký tự đã cho và quyết định chuỗi nào sẽ xuất hiện trước chuỗi ký tự kia

Tài liệu Máy chủ MySQL nói. "Đối với các chuỗi không nhị phân (CHAR, VARCHAR, TEXT), tìm kiếm chuỗi sử dụng đối chiếu các toán hạng so sánh. Đối với các chuỗi nhị phân (BINARY, VARBINARY, BLOB), phép so sánh sử dụng các giá trị số của các byte trong toán hạng;

Bộ ký tự và đối chiếu mặc định là latin1 và latin1_swedish_ci, do đó, so sánh chuỗi không nhị phân không phân biệt chữ hoa chữ thường theo mặc định. "

Có hai cách khác để làm cho tìm kiếm phân biệt chữ hoa chữ thường

  • một trong các toán hạng có phân biệt chữ hoa chữ thường hoặc đối chiếu nhị phân (e. g. nó có thể được đặt thông qua COLLATE trong khai báo cột)
  • toán tử COLLATE được sử dụng trong thao tác so sánh

dotConnect cho MySQL cung cấp các cách sau để truy cập chức năng này từ Entity Framework

  • Chức năng MySql. Phương thức đối chiếu để bao gồm toán tử COLLATE với đối chiếu cần thiết trong SQL được tạo
  • cấu hình. Tùy chọn truy vấn. So sánhCollation và cấu hình. Tùy chọn truy vấn. Tùy chọn LikeCollation, thiết lập đối chiếu trên toàn cầu (trong AppDomain hiện tại) cho toán tử COLLATE trong các trường hợp "bằng"/"không bằng" và trong. Chứa/. Bắt đầu với/. Các phương thức EndsWith tương ứng

Dưới đây là ví dụ về việc sử dụng chức năng này

CREATE TABLE DEPT (
  DEPTNO INT PRIMARY KEY,
  DNAME VARCHAR(14),
  LOC VARCHAR(13)
);
INSERT INTO DEPT VALUES (15,'New Department','Denver');
INSERT INTO DEPT VALUES (16,'NEW DEPARTMENT','Denver');
INSERT INTO DEPT VALUES (17,'new department','Denver');
	

Câu lệnh SELECT sau đây trả về ba hàng

SELECT * FROM DEPT WHERE DNAME LIKE 'n%'

Câu lệnh SELECT sau đây trả về một hàng

SELECT * FROM DEPT WHERE DNAME COLLATE latin1_bin LIKE 'n%'

Và cái sau trả về hai hàng

SELECT * FROM DEPT WHERE DNAME COLLATE latin1_bin LIKE 'n%'

Chạy công cụ dbMonitor để cho phép theo dõi hoạt động cơ sở dữ liệu và xem các truy vấn, được tạo bởi các ví dụ về Khung thực thể của chúng tôi

Ví dụ sau minh họa việc sử dụng MySqlFunctions. phương pháp đối chiếu trong so sánh hoặc trong. Chứa/. Bắt đầu với/. EndsWith phương pháp

        var monitor = new Devart.Data.MySql.MySqlMonitor() { IsActive = true };

        using (MyDbContext context = new MyDbContext()) {

            var equals_query = context.Depts.Where(d => MySqlFunctions.Collate(d.DNAME, "latin1_bin") == "New Department");
            var equals_results = equals_query.ToList();

            var not_equals_query = context.Depts.Where(d => MySqlFunctions.Collate(d.DNAME, "latin1_bin") != "New Department");
            var not_equals_results = not_equals_query.ToList();

            var like_query = context.Depts.Where(d => MySqlFunctions.Collate(d.DNAME, "latin1_bin").Contains("New"));
            var like_results = like_query.ToList();
        }

        Dim monitor As New Devart.Data.MySql.MySqlMonitor
        monitor.IsActive = True

        Using context As New MyDbContext

            Dim equals_query = context.Depts.Where(Function(d) MySqlFunctions.Collate(d.DNAME, "latin1_bin") = "New Department")
            Dim equals_results = equals_query.ToList()

            Dim not_equals_query = context.Depts.Where(Function(d) MySqlFunctions.Collate(d.DNAME, "latin1_bin") <> "New Department")
            Dim not_equals_results = not_equals_query.ToList()

            Dim like_query = context.Depts.Where(Function(d) MySqlFunctions.Collate(d.DNAME, "latin1_bin").Contains("New"))
            Dim like_results = like_query.ToList()

        End Using

Và ví dụ sau sử dụng cấu hình. Tùy chọn truy vấn. So sánhCollation và cấu hình. Tùy chọn truy vấn. Tùy chọn LikeCollation để đặt đối chiếu trên toàn cầu

Theo mặc định, SQL Server không phân biệt chữ hoa chữ thường; . Cách để xác định xem cơ sở dữ liệu hoặc đối tượng cơ sở dữ liệu là kiểm tra thuộc tính "COLLATION" của nó và tìm kiếm "CI" hoặc "CS" trong kết quả

Bạn có thể đạt được tính duy nhất phân biệt chữ hoa chữ thường và tìm kiếm không phân biệt chữ hoa chữ thường với sự trợ giúp của hai cách sau –

  • Kiểu dữ liệu VARBINARY
  • đối chiếu _bin

Kiểu dữ liệu VARBINARY

Để làm việc với kiểu dữ liệu VARBINARY, trước tiên chúng ta hãy tạo một bảng. Truy vấn để tạo một bảng như sau -

Là dữ liệu trong trường hợp MySQL

Tên bảng được lưu trữ bằng chữ thường trên đĩa và so sánh tên không phân biệt chữ hoa chữ thường . MySQL chuyển đổi tất cả các tên bảng thành chữ thường khi lưu trữ và tra cứu. Hành vi này cũng áp dụng cho tên cơ sở dữ liệu và bí danh bảng.

Làm thế nào để sử dụng trường hợp

Khi tìm kiếm một phần chuỗi trong MySQL với LIKE, bạn sẽ khớp phân biệt chữ hoa chữ thường theo mặc định*. Nếu bạn muốn đối sánh phân biệt chữ hoa chữ thường, bạn có thể truyền giá trị dưới dạng nhị phân và sau đó thực hiện so sánh từng byte với. so sánh từng ký tự . Điều duy nhất bạn cần thêm vào truy vấn của mình là BINARY.

Trường hợp thay thế MySQL

Định nghĩa và cách sử dụng . Ghi chú. Hàm này thực hiện thay thế phân biệt chữ hoa chữ thường

Trường hợp SQL TEXT

Các từ khóa SQL (SELECT, FROM, WHERE, v.v. ) không phân biệt chữ hoa chữ thường , nhưng chúng thường được viết hoa tất cả. Tên bảng và cột phân biệt chữ hoa chữ thường trong một số cài đặt. MySQL cung cấp một cài đặt cho phép bạn bật hoặc tắt nó.